Букмарклет і правила їх написання
Для прикладу зробимо букмарклет, який здійснює пошук виділеного тексту в гуглі.
В кінці функції 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 і відокремити пропуском від подальшого числа.