[سوال]: جستجو در صفحه توسط جاوا اسکریپت

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
سلام دوستان عزیز

راستش من زیاد با جاوا اسکریپت آشنایی ندارم، یک کد هم پیدا کردم اما نتونستم ازش استفاده کنم
کد:
var NS4 = (document.layers);
var IE4 = (document.all);
var win = window;
var n   = 0;
function findInPage(str) {
    var txt, i, found;
    if (str == "")
        return     false;
    if (NS4) {
        if (!win.find(str))
            while(win.find(str, false, true))
                n++;
        else
            n++;
        if (n == 0)
            alert("Not found.");
    }
    if (IE4) {
        txt = win.document.body.createTextRange();
        for (i = 0; i <= n && (found = txt.findText(str)) != false; i++) {
            txt.moveStart("character", 1);
            txt.moveEnd("textedit");
        }
        if (found) {
            txt.moveStart("character", -1);
            txt.findText(str);
            txt.select();
            txt.scrollIntoView();
            n++;
        }
    else {
        if (n > 0) {
            n = 0;
            findInPage(str);
        }
        else
            alert("چنين کلمه اي يافت نشد ");
        }
    }
    return false; 
}
سوال من این هست که چطور یک کد جاوا اسکریپت بنویسیم که متنی رو که بهش میدیم، رو در صفحه پیدا کنه و همشون رو هایلایت کنه، مثل جستجو گرهایی که در مرورگرها وجود داره.

البته من این کد رو برای یک صفحه ی اینترنتی نمیخوام، در MMB ما شئ Browser داریم که در واقع از IE خود سیستم عامل استفاده میکنه، حالا صفحه ی HTML ما تو این شئ لود شده و درواقع ما به سورسش دسترسی نداریم
در عوض یک کد جاوا اسکریپت رو بعنوان URL لود میکنیم در اون شئ تا عملیاتی که موردنظر ما هست اجرا بشه
مثلاً کد زیر رو که بعنوان URL لود کنیم، تمامی کلمات MMB رو به Multimedia Builder تغییر میده:
کد:
javascript:replaceText=function(){content=document.body.innerHTML;document.body.innerHTML=content.replace(/MMB/g,'<b>Multimedia Builder</b>');};replaceText()
از کد اول که قرار دادم، به شکل زیر استفاده کردم اما نتیجه ای نگرفتم:
کد:
javascript:var NS4 = (document.layers);     var IE4 = (document.all); var win = window;     var n   = 0; function findInPage(str) {   var txt, i, found;   if (str == "")     return FALSE;   if (NS4) {     if (!win.find(str))       while(win.find(str, FALSE, TRUE))         n++;     Else       n++;     if (n == 0)       alert("Not found.");   }   if (IE4) {     txt = win.document.body.createTextRange();     for (i = 0; i <= n && (found = txt.findText(str)) != FALSE; i++) {       txt.moveStart("character", 1);       txt.moveEnd("textedit");     }     if (found) {       txt.moveStart("character", -1);       txt.findText(str);       txt.select();       txt.scrollIntoView();       n++;     }     Else {       if (n > 0) {         n = 0;         findInPage(str);       }       Else         alert("چن?ن کلمه ا? ?افت نشد ");    }   }   return FALSE; };findInPage("MMB");

ممنون میشم راهنمایی کنید :rose:
 

eAmin

Well-Known Member
سلام
در واقع شما دارید از کدهای جاوااسکریپت بصورت بوکمارکلت استفاده میکنید!
می تونید از این bookmarklet ی که نوشتم استفاده کنید، یک تابع به نام find تعریف شده، و دو پارامتر دریافت میکنه، پارامتر اول کلمه ای که باید مورد جستجو قرار بگیره و پارامتر دوم هم اگر برابر true قرار بگیره، نسبت به کوچک و بزرگی حروف حساس نیست. اگر false و یا اصلا پارامتر دوم رو مقدار دهی نکنید به کوچک و بزرگی حروف حساس هست.
کد:
javascript:(function(window){window.find=function find(word,ignorCase){var eBody=document.body||document.getElementsByTagName("body")[0],content=eBody.innerHTML,re=new RegExp(word+"",(ignorCase!=null&&ignorCase===true)?"gi":"g");if(!re.test(content)){alert("چنین موردی یافت نشد."); return;}content = content.replace(re, "<span style='background-color:#FFFBCC'>$&<\/span>");eBody.innerHTML = content;}})(window);find("MmB", true);

موفق باشید.
 
آخرین ویرایش:

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
سلام،
ممنون از پاسختون

درواقع من کدی که پیدا کرده بودم رو کمی خلاصه ش کردم و تونستم ازش استفاده کنم:
کد:
javascript:var win = window;var n = 0;function findInPage(str) {var txt, i, found;txt = win.document.body.createTextRange();for (i = 0; i <= n && (found = txt.findText(str)) != false; i++) {txt.moveStart("character", 1);txt.moveEnd("textedit");}if (found) {txt.moveStart("character", -1);txt.findText(str);txt.select();txt.scrollIntoView();n++;txt.scroll;} else {if (n > 0) {n = 0;findInPage(str);}else alert("Not Found !!!");}}findInPage("MMB");

هردو کد جواب میدن، اما درواقع در کنار هم کامل میشن !

کد اول، فقط یک کلمه رو پیدا میکنه و همه رو هایلایت نمیکنه، اما با هربار جستجو، فقط کلمه ی مورد جستجو هایلایت میشه و کلمه ی قبلی که هایلایت شده از حالت انتخاب خارج میشه

اما کد شما همه ی کلمات در یک صفحه رو پیدا میکنه، اما در عوض هربار که جستجو میکنیم، کلمه ی جدید هایلایت میشه و اگه باز هم جستجو کنیم، کلمه ی قبلی از حالت هایلایت خارج نمیشه.

البته با یک مشکل بزرگتر مواجه شدم که مربوط به خود MMB هست و نه کدها !
برای داده های غیرلاتین (فارسی)، بعضی از کلمات رو نمیتونه پیدا کنه، و در کد شما، اگه چند حرف از یک کلمه رو جستجو کنید (مثلاً "توان" در "می توانید")، حرف آخر رو ازحرف بعدی جدا میکنه وقتی هایلایت شد، که همه ی اینها بخاطر این هست که MMB یک برنامه ی اصطلاحاً Unicode-Friendly نیست !

به هرحال ممنون از راهنماییتون (درواقع کد آماده :wink: )
 

جدیدترین ارسال ها

بالا