Букмарклет і правила їх написання

Для прикладу зробимо букмарклет, який здійснює пошук виділеного тексту в гуглі.

В кінці функції searchGoogle варто void 0. Це кросбраузерності зупиняє обробку посилання браузером, запобігаючи непотрібний перехід.

Після цього досить виділити текст на сторінці і клікнути на закладку, щоб знайти виділений текст в гугл.

Відкритий документ може являти собою фреймсет. При цьому способи звернення до вмісту, використані в нашому прикладі, працювати не будуть. Текст треба шукати у фреймах, а не в поточному вікні.

Є кілька способів обійти цю проблему.

Якщо букмарклет не задумався для роботи з кадрами - можна перевіряти їх наявність і виводити попередження.

Для більш надійної роботи виключимо іфрейми: в переважній більшості сайтів вони використовуються чисто технологічно: в ajax, для обходу деяких багів тощо.

З іншого боку, підтримка фреймів - хороша фіча. Наприклад, букмарклет для пошуку в гугл повинен працювати на сайтах з фреймами.

Рішення - рекурсивний обхід фреймів:

Виклик traverse (window) рекурсивно обробляє (наприклад, шукає виділення) все фрейми, починаючи з поточного вікна.

Так як букмарклет закритий в подвійні лапки - бажано використовувати в коді або ", або одинарні.

Наприклад, в Букмарклет для пошуку в гугл можна замінити всі "на одинарні лапки. Теж буде працювати:

Якщо функція або операція присвоювання повертає значення - то, яке б воно не було, букмарклет перенаправить відвідувача на нову сторінку, яка показує це значення.

Іноді це можна грамотно використовувати. наприклад показати зведення за ключовими словами в документі. Зазвичай же це значення перехоплюють і обнуляют за допомогою void. Типове рішення - поставити в кінці букмарклета:

Альтернативний варіант - робити всю роботу всередині функції, не повертає значення. Для цього створюється і тут же викликається анонімна функція:

Цей спосіб має ще той бонус, що ви можете використовувати локальні змінні і не забруднювати глобальну область видимості.

Букмарклет працює в глобальному контексті.

Це означає, що навіть невелика, оголошена з var. буде глобальної:

Щоб це обійти - використовують 2 способи.

Перший - призначити змінним унікальні імена типу aBBZZ. Це криво.

Другий - обертати букмарклет в анонімну функцію:

При цьому також відпадає необхідність в void.

Так виглядає пошуковий букмарклет, обгорнутий в анонімну функцію:

На відміну від початкового варіанту, він не забруднює глобальну область змінними selected і q.

Число символів в Букмарклет обмежена. Причому, воно варіюється не тільки від браузера до браузеру, а й між версіями.

Ось деякі дані:

Як бачите, Internet Explorer 6.0 тримає до 508 символів, а Internet Explorer 6.0 SP2 - ще гірше, всього лише 488 символів. Так що, якщо ви хочете бути впевненими, що букмарклет запуститься в IE6 - обмежте його 488 символами.

Щоб це обійти, букмарклет в IE може підключати зовнішні скрипти:

Альтернативний підхід - розробляти букмарклет тільки для "Просунутих браузерів". Це працює, якщо букмарклет є корисний інструмент, заради якого не лінь і браузер змінити.

Наприклад, багато SEO'шние букмарклет зроблені саме так. Хочеш використовувати - постав FF і інструмент до твоїх послуг.

  • Версія для друку

Доброго времени суток, підкажіть, де може бути помилка?

Намагаюся реалізувати описаний для IE спосіб підключення скриптів через зовнішні файли:

яка завантажує локальний файл зі скриптом

Намагався додавати теж саме в body, а також викликати функцію "вручну" через консоль firebug. Сам скрипт і його вміст з'являється в html відладчика, але консоль видає, що функція "not defined", і нічого не відбувається. NoScript'ом дозволені локальні скрипти.
Я щось роблю неправильно, або це якась політика безпеки браузера, або ще що?

Створюю свій проект. І виник точно таке ж питання, як і у Вас. Адже будь-який школяр вже зможе з легкістю поламати мені мою задумку. Зараз цих так званих готових Букмарклет хоч відбавляй! Але ніхто не пише як від них захиститися, можливо ніхто і не знає як це зробити. Може все-таки є розумники? Так само, це питання спробую вирішити сам. Якщо знайду рішення, обов'язково відпишуся.

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

Епідемія jQuery головного мозку, СИЛЬНО полегшує розробку Букмарклет
На більш-менш великому сайті напевно включений jQuery, а якщо немає - то якась інша бібліотека.

Доброго дня!
Народ допоможіть будь ласка початківцю розібратися з наступною конструкцією з прикладу:

1 if (frames.length> document.getElementsByTagName ( 'iframe'). Length)
2 alert ( 'Вибачте, фрейми не підтримуються.');
3 else 4 / * код букмарклета * /
5>

А саме, не можу збагнути в яких ситуаціях умова в if поверне істину.
Як міркую я. є допустити на сторінці один елемент Iframe. отже
window.frames.length = 1;
Об'єкт NodeList Повертається методом getElementsByTagName. буде містити 1 об'єкт iframe. значить document.getElementsByTagName ( 'iframe'). length = 1;
Умова не виповнилося значить Алерт ми не побачимо, але фрейм на сторінці є
Питання де я помиляюся?

Дуже сподіваюсь на вашу допомогу!
Дякуємо!

Є ще один нюанс з символом%. Їх потрібно замінити на% 25 і відокремити пропуском від подальшого числа.