Bookmarklet, который захватывает выбранный контент, включая HTML-теги - PullRequest
4 голосов
/ 12 мая 2011

Я создаю букмарклет JS, который позволяет мне захватывать текст, выбранный пользователем в браузере, и отправлять его в веб-приложение. В настоящее время я проверил несколько учебников и у меня есть скрипт, который выглядит следующим образом:

javascript:var t;try {t=((window.getSelection&&window.getSelection())||(document.getSelection&&document.getSelection())||(document.selection&&document.selection.createRange&&document.selection.createRange().text));}catch(e){t="";}alert(t);

Чтобы сделать это немного проще, вот код в более удобочитаемой форме:

javascript:
      var t;
      try {
        t=((window.getSelection&&window.getSelection()) || (document.getSelection&&document.getSelection()) || (document.selection&&document.selection.createRange&&document.selection.createRange().text));
      }catch(e)
      {
        t="";
      }
      alert(t);

Текущий код, который у меня есть, захватывает выделенный текст и выдает предупреждение, чтобы я мог видеть, что было захвачено. Тем не менее, форматирование текста важно для меня, так что я действительно хотел бы захватить любой HTML-код в этом тексте. На самом деле, я думаю, что было бы еще лучше выяснить, где пользователь выбрал на странице, и посмотреть вверх от начала и назад от конца выбранного контента, чтобы найти ближайшие HTML-теги, а затем взять то, что внутри. (поскольку пользователь не может определить, выбирает ли он HTML или нет)

Я гораздо больше привык работать с JQuery для выбора DOM, так что это немного над моей головой в данный момент. (Если вы не можете использовать JQuery с букмарклетом ... не так ли?)

Может кто-нибудь помочь мне с этим? (Даже просто указав мне правильное направление, было бы здорово, я делаю это как проект обучения хобби, так что я сам с удовольствием разбираюсь с некоторыми вещами.)

Ответы [ 2 ]

10 голосов
/ 12 мая 2011

Следующая функция вернет строку, содержащую 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)&&s.type=="Text"){h=s.createRange().htmlText;}alert(h);})()
2 голосов
/ 12 мая 2011

Добавьте результаты getSelection (). GetRangeAt (0) .cloneContents () к div, а затем получите innerHTML div.

javascript:(function()%7Bvar%20node%3Ddocument.createElement('div')%3Bnode.appendChild(getSelection().getRangeAt(0).cloneContents())%3Balert(node.innerHTML)%3B%7D)()%3B

Если вы передаете разметку в запросе GET,сначала вам нужно будет использовать encodeURIComponent ().

Также обратите внимание, что запрос GET может принимать только столько данных.

...