Букмарклет, который фиксирует выбранный контент, включая html-теги

#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!