Pull to refresh

Comments 25

просто интересно: нахрена if(typeof s != 'object')?
кроссбраузерность наверно
Кроссбраузерность + это короче, чем:
d.standardCreateElement ? d.standardCreateElement('script') : d.createElement('script');
Вообще это для некоторых особо умных сайтов.
В IE6 есть нехорошее ограничение на длину кода букмарклета.
М.б. тогда попробывать:
s = d.createElement('script') || d.standardCreateElement('script');
?
Дело в том, что createElement перекрывается некоторыми сайтами для того, чтобы туда ничего не подгружали. Функция может чего-нибудь и вернуть…
Логично предположить. Тогда
s = (d.standartCreateElement || d.createElement)('script');
?
Однако в FF3 не работает…
Illegal operation on WrappedNative prototype object.
и в FF2 тоже :)
ему нужно

s = (d.standartCreateElement || d.createElement).call(d, 'script');


Function.call() не работает в IE5, но думаю это вас не сильно огорчит ;)
Ну, лучше конечно, чтобы работало… в код включать не буду, но на заметку обязательно возьму.
и еще один вариант :)

var d = document, s = (d.getElementsByTagName('script')[0] || d.createElement('script')).cloneNode(true);
s.src = 'http://example.com/js/bookmarklet.js';
s.type = 'text/javascript';
d.body.appendChild(s);


Тут d.createElement('script') нужен только для страниц где нет ни одного script. Помоему таких не много :) потому можно обойтись и вариантом только с getElementsByTagName/cloneNode. Ну и еще немного поиздеваться над кодом :)

(s = (d = document).getElementsByTagName('script')[0].cloneNode(true)).src = 'http://example.com/js/bookmarklet.js';
s.type = 'text/javascript';
d.body.appendChild(s);
Страниц без скрипта приличное количество, так что совсем убирать создание ноды нехорошо :)

Что касается первой части — разница в производительности получится незначительная, а вот длина выросла (standartCreateElement выкидывать не очень хочется).
Кстати, если кто знает как улучшить или уменьшить код — не стесняйтесь…
В общем кто знает что такое доры будут очень довольны :) зы "чужие" стили таким же образом добавляются
все писатели букмарклетов такое используют

короче тоже можно сделать: забить на setAttribute, и нормально присваивать атрибуты напрямую: s.src='...'

getElementsByTagName работает не очень шустро, а скрипты можно в любое место страницы вставлять, поэтому проще (и короче) будет d.body.appendChild()

и w = window вы тоже не используете, сотрите ; )
w = window остался от попапного букмарклета :) Не заметил. Спасибо.
Забить на setAttribute и вставлять в body попрбую.
Проверил. Работает замечательно. Спасибо.
Один аспект - что произойдет, если страница еще не загружена, DOM не построен (к примеру, один из тучи банеров подтормаживает), а мы вызываем body.appendChild? Правильно - ошибка ;)

По-уму надо юзать что-то вроде body.insertBefore(scriptElement, body.firstChild), или добавлять линк в head, где проблем с построением DOM'а не возникнет
Sign up to leave a comment.

Articles