Какова лучшая практика для написания букмарклетов? - PullRequest
5 голосов
/ 19 декабря 2009

Я пишу несколько букмарклетов для проекта, над которым я сейчас работаю, и мне было интересно, как лучше всего написать букмарклет. Я немного осмотрелся и вот что я придумал

 javascript:void((function()
  {
    var%20e=document.createElement('script');
    e.setAttribute('type','text/javascript');
    e.setAttribute('src','http://someserver.com/bookmarkletcode.js');
   document.body.appendChild(e)
  })())

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

Ответы [ 2 ]

7 голосов
/ 26 марта 2010

Этот букмарклет будет добавлять новую копию скрипта к документу при каждом запуске. Для долгоживущих страниц (например, Gmail) это может привести к значительному использованию памяти, и если загрузка вашего скрипта имеет побочные эффекты, они будут происходить несколько раз. Лучшей стратегией было бы дать вашему сценарию идентификатор и сначала проверить наличие этого элемента, например ::

var s = document.getElementById('someUniqueId');
if (s) {
  s.parentNode.removeChild(s);
}
s = document.createElement('script');
s.setAttribute('src', 'http://example.com/script.js');
s.setAttribute('type', 'text/javascript');
s.setAttribute('id', 'someUniqueId');
document.body.appendChild(s);

N.B. Другой вариант - сохранить существующий скрипт, если он уже есть в документе. Это может сэкономить некоторый трафик сервера, если ваш букмарклет часто используется между перезагрузками страницы. В худшем случае кто-то какое-то время использует более старую версию вашего скрипта; если вы не ожидаете, что оно будет часто меняться, это может быть хорошо.

3 голосов
/ 20 декабря 2009

выглядит хорошо. Но если ваш js-файл уже кэширован, он не будет запрашиваться каждый раз. Значит, вам нужно добавить его? + new Date () для вашего атрибута src, чтобы гарантировать, что он запрашивается каждый раз.

...