#javascript #bookmarklet
#javascript #букмарклет
Вопрос:
Я создаю букмарклет JS, который позволяет мне захватывать текст, выбранный пользователем в своем браузере, и отправлять его в веб-приложение. В настоящее время я просмотрел пару руководств, и у меня есть скрипт, который выглядит следующим образом:
javascript:var t;try {t=((window.getSelectionamp;amp;window.getSelection())||(document.getSelectionamp;amp;document.getSelection())||(document.selectionamp;amp;document.selection.createRangeamp;amp;document.selection.createRange().text));}catch(e){t="";}alert(t);
Чтобы сделать это немного проще, вот код в более удобочитаемом виде:
javascript:
var t;
try {
t=((window.getSelectionamp;amp;window.getSelection()) || (document.getSelectionamp;amp;document.getSelection()) || (document.selectionamp;amp;document.selection.createRangeamp;amp;document.selection.createRange().text));
}catch(e)
{
t="";
}
alert(t);
Текущий код, который у меня есть, захватывает выделенный текст и выдает предупреждения, чтобы я мог видеть, что было захвачено. Однако форматирование текста важно для меня, поэтому то, что я действительно хотел бы сделать, это захватить любой HTML в этом тексте тоже. На самом деле, я думаю, что было бы еще лучше определить, какое место пользователь выбрал на странице, и просмотреть с начала и обратно с конца выбранного контента, чтобы найти ближайшие HTML-теги, а затем захватить то, что находится внутри этого. (поскольку пользователь не может сказать, легко ли он выбирает HTML или нет)
Я гораздо больше привык работать с jQuery для выбора DOM, так что на данный момент это немного выше моих сил. (Если только вы не можете использовать jQuery с букмарклетом… можете ли вы?)
Кто-нибудь может мне помочь с этим? (Было бы здорово даже просто указать мне правильное направление, я делаю это в качестве учебного проекта для хобби, поэтому я рад сам разобраться в некоторых вещах.)
Комментарии:
1. Если вы действительно хотите использовать jQuery в нем, посмотрите: smashingmagazine.com/2010/05/23 /…
2. Ну, jQuery — это то, с чем я знаком. Но я задаюсь вопросом о раздувании того, что технически было бы очень маленькой частью JS с ним… (Если, и это большое если, то то, что я пытаюсь сделать, на самом деле довольно просто в разных браузерах). Огромное спасибо, я обязательно попробую!
Ответ №1:
Следующая функция вернет строку, содержащую выбранный пользователем HTML:
function getSelectionHtml() {
var html = "";
if (typeof window.getSelection != "undefined") {
var sel = window.getSelection();
if (sel.rangeCount) {
var container = document.createElement("div");
for (var i = 0, len = sel.rangeCount; i < len; i) {
container.appendChild(sel.getRangeAt(i).cloneContents());
}
html = container.innerHTML;
}
} else if (typeof document.selection != "undefined") {
if (document.selection.type == "Text") {
html = document.selection.createRange().htmlText;
}
}
return html;
}
Вот сокращенная версия букмарклета:
javascript:(function(){var h="",s,g,c,i;if(window.getSelection){s=window.getSelection();if(s.rangeCount){c=document.createElement("div");for(i=0;i<s.rangeCount; i){c.appendChild(s.getRangeAt(i).cloneContents());}h=c.innerHTML}}else if((s=document.selection)amp;amp;s.type=="Text"){h=s.createRange().htmlText;}alert(h);})()
Комментарии:
1. Спасибо! Это в значительной степени то, что я пытался сделать 🙂
Ответ №2:
Добавьте результаты getSelection().getRangeAt(0).cloneContents() в div, а затем получите innerHTML div.
javascript:(function(){var node=document.createElement('div');node.appendChild(getSelection().getRangeAt(0).cloneContents());alert(node.innerHTML);})();
Если вы передаете разметку в запросе GET, вам нужно сначала использовать encodeURIComponent() для этого.
Также обратите внимание, что запрос GET может принимать только такой объем данных.
Комментарии:
1. Спасибо за совет по кодированию GET!