Рады для напісання букмаклетаў
Сфера букмаклетаў
букмаклетаў запусціць у бягучым акне браўзара і больш нідзе. Гэта азначае, што вы не можаце з акна-тое змяніць у акне B. Гэта пытанне бяспекі. Можна, аднак, траверс вокнаў усярэдзіне бягучага акна – у гэтым выпадку мы кажам пра набор.
Іерархія DOM
Акно браўзара верхнім узроўні аб’ектаў, якія букмарклет спасылкі. Адгэтуль вы можаце праглядаць на ўсе іншыя прадметы Ваш браўзар падтрымлівае. Вокны аб’екта маецца на ўвазе, так window.document і document адно і тое ж.
Акно заўсёды ўтрымоўвае аб’ект дакумента. Гэты дакумент утрымоўвае элементы старонкі, такія як спасылкі, формы і г.д.
Акно можа ўтрымоўваць лік кадраў (у гэтым выпадку ён фрэймаў). Гэтыя кадры можна прайсці, і кожны кадр можна разглядаць як акно (бо гэта тое, што кадр насамрэч).
Выяўленне рамкі
Калі ёсць чыннік не рабіць гэтага, карыстачы па добрай якасці ацэняць, калі закладка можа апрацоўваць як аформлена і не аформлена старонак.
Нават калі закладка не падтрымлівае фрэймы ён павінен яшчэ быць дасведчаныя пра іх, таму, калі карыстач працуе ў закладкі фрэймамі ён скажа карыстач не можа выканаць. Вы можаце выкарыстоўваць гэты код для гэтай мэты:
if(frames.length > 0)
alert('Sorry, frames detected.');
else{
/* Regular code goes in here */
}
Існуе толькі адна праблема: Убудаванае кадры (фрэймы), паказваюцца ў браўзары ў выглядзе фрэймаў (за выключэннем Netscape 4.7, якая не прызнае іх). Тым не менш, вы можаце выкарыстоўваць getElementsByTagName метад для атрымання колькасці фрэймаў у бягучым дакуменце. Так што, калі frames.length больш getElementsByTagName('iframe').length, тое гэта азначае, што вы маеце справу з “рэальнай” фрэймаў. Давайце зменім код:
if(frames.length > document.getElementsByTagName('iframe').length)
alert('Sorry, frames detected.');
else{
/* Regular code goes in here */
}
Крос-фрэйм праблемы
Па меркаваннях бяспекі вашага браўзара не дазваляюць запусціць сцэнар за межамі бягучага дамена сайта. Гэта азначае, што калі фрэймаў знайсці на geocities.com утрымоўвае раму старонку ibm.com, тыя вы не можаце запусціць букмарклет ці любы іншы код сцэнара ў гэтым фрэйме. Насамрэч, спроба зрабіць гэта будзе вырабляць доступ выключэнне. Вы можаце знайсці падрабязную інфармацыю тут.
Вы можаце думаць, крос-кадраў не з’яўляецца вялікай праблемай, але для закладкі аўтараў, таму што шматлікія старонкі ўтрымоўваюць рэкламныя банары ў iFrame. Гэтыя аб’явы амаль заўсёды знаходзіцца на іншым дамене. Такім чынам, калі вы паходу фрэймаў 1 кадр у той момант, вы можаце сапхнуцца з доступам выключэнне, якое робіць вашы закладкі няўдачу.
Да шчасця, JavaScript, падтрымлівае апрацоўку выключэнняў, а таксама ўсе сучасныя браўзары яе рэалізацыі (Explorer з версіі. 5,5, Netscape з версіі 6., Опера з версіі?.). Сінтаксіс:
try{
...
}
catch(e){
...
}
Выкарыстанне апрацоўкі выключэнняў, гэта бяспечна для доступу да крос-кадраў. Вы не атрымаеце доступу, але прынамсі, не загубіць вашу закладку. Гэта паказана на малюнку.
Абыход Frameset
Вы можаце выкарыстоўваць код у якасці шаблону для букмарклеты, якія могуць апрацоўваць як аформлена і не аформлена старонак.
Вось як гэта працуе: акно заўсёды мае патэнцыял утрымоўваюць кадры, як і фрэймы ці ў звычайных фрэймаў. Гэтыя рамкі могуць таксама ўтрымоўваць кадры, і гэтак далей. Пачынальна з бягучага акна, мы першыя маніпуляваць яго ўтрыманне нейкім чынам (змена колеру, напрыклад), то для кожнага патэнцыйнага кадра ў акно, мы рэкурсіўна выклік таго ж метаду, перадаючы кадр у якасці параметру (памятаеце, што кадр жа акне). Паспрабаваць … злавіць забяспечвае закладка можа апрацоўваць памылкі доступу (як правіла, выкліканы аб’явы IFRAME).
function traverse(w){
try{
/* Manipulate w.document */
...
for(var i=0; i<w.frames.length; i++){
traverse(w.frames[i]);
}
catch(e){
/* Do something with e or just do nothing */
}
}
traverse(window);
Радкі
У JavaScript вы можаце выкарыстоўваць як адзінарныя двукоссі (“XXX”) і падвойныя двукоссі (“ххх”) у радку выраза. Калі вы жадаеце радкі ўсярэдзіне радка можна напісаць так: s='x="hello";'. Бо вы заўсёды павінны выкарыстоўваць адзінкавыя двукоссі (гэта палягчае распаўсюджваць свае букмарклеты), вы павінны ў зямельным напісаць так: s='x=\'hello\';'. Зваротную касую рысу перад апостраф азначае апостраф варта разглядаць у якасці знака ў радку.
Литераризованный адзінкавыя двукоссі (так яны завуцца, калі яны маюць зваротную касую рысу на пярэднім плане) і практычныя калі ў вас ёсць словы ці фразы, якія выкарыстоўваюць двукоссі, вось так: s='Rock\'n\'roll isn\'t dead'.
Нарэшце, вы можаце часам выкарыстоўваць бегчы і Unescape функцый. unescape(%27) з’яўляецца адной цытаты. Браўзар аўтаматычна робіць яго ў якасці адзінага цытатай калі закладка выконваецца.
function() трык
Стомленасць выкарыстання void злавіць вяртанні каштоўнасцяў? Калі вы пакладзяце заяву (function(){...})() вакол вашага кода, складзена, каб вы аўтаматычна перахапляць усе якія вяртаюцца значэнні. (function(){...}) частка стварае безназоўныя функцыі. () частка запускае яго. Гэта працуе ва ўсіх браўзарах. Прыклад:
javascript:
(function(){
...
x=3;
lnks=document.links;
document.links[0].href='http://www.ibm.com/';
...
})
()
Як правіла, вы павінны выкарыстоўваць void, каб злавіць якія вяртаюцца значэнняў (гл. тлумачэнне на старонкі правіл), а з дапамогай функцыі () трук вам не прыйдзецца турбавацца пра гэта.
Паўторнае выкарыстанне глабальных зменных
Вы можаце выкарыстоўваць той факт, што зменныя ў букмарклеты з’яўляюцца глабальнымі (калі гэта, як заявілі мясцовыя ўсярэдзіне функцыі, выкарыстоўваючы var ці функцыі () хітрасць).
Прыкладам можа служыць два букмарклеты, якія маюць агульную зменную. Закладка 1 можна захоўваць вылучыце становішча бягучай старонкі ў глабальнай зменнай завецца scroll. Закладка 2 можа затым быць названа, аднаўленне вылучыце пазіцыю, чытаючы і той жа зменнай (пры ўмове, што карыстач не пакінуць ці абновіце старонку тым часам).
Яшчэ адным прыкладам з’яўляецца “Чытаць Глабальная зменная” прыладай, які дае вам значэнне любым глабальным зменным вам падабаецца.
Сцэнар Уключэнне
Калі вы жадаеце стварыць букмарклеты з вялікім логіка можа быць добрай ідэяй стварыць вонкавы файл JavaScript (*. JS), а затым уключыць гэты файл у загружанай старонкі.
Дагэтуль толькі Internet Explorer дазваляе вам гэта зрабіць. Вось гэты код:
var script=document.createElement('script');
script.src='http://...mysite.../...myscript.js';
document.getElementsByTagName('head')[0].appendChild(script);
...
/* Call functions found in myscript.js here */
Акрамя таго, вашы закладкі адкрыць у новым акне. У дакуменце гэтым новым акне Вы пішаце копію бягучага дакумента, з тым выключэннем, што Вы слізгаеце ў сцэнары спасылку, выкарыстоўваючы <script> пазнакі. Вось код (працуе ў большасці сучасных браўзараў):
var src=''+document.documentElement.innerHTML+'</html>';
src=src.replace(/<HEAD>/i,
'<HEAD><script src=\'http://...mysite.../...myscript.js\'></script>');
var win=open();
with(win.document){
open();
write(src);
close();
}
...
/* Manipulate win using myscript.js functions */
Іншыя рады
Гл. таксама спасылкі на артыкулы, апісвальныя, як стварыць уласны букмарклеты.
