1

Тема: JS+bookmarklet+Opera: Открыть ссылку, содержащую определенное слово

javascript:(function(){var n_to_open,dl,dll,i; function linkIsSafe(u) { if (u.substr(0,7)=='mailto:') return false; if (u.substr(0,11)=='javascript:') return false; return true; } n_to_open = 0; dl = document.links; dll = dl.length; for(i = 0; i < dll; ++i) { if (linkIsSafe(dl[i].href)) ++n_to_open; } if (!n_to_open) alert ('no links'); else { if (confirm('Open ' + n_to_open + ' links in new windows?')) for (i = 0; i < dll; ++i) if (linkIsSafe(dl[i].href)) window.open(dl[i].href); } })();

Приведенный букмарклет, выведя окно подтверждения, откроет все ссылки страницы в новом окне.
Он же:

javascript: (function () {
    var n_to_open, dl, dll, i;

    function linkIsSafe(u) {
        if (u.substr(0, 7) == 'mailto:') return false;
        if (u.substr(0, 11) == 'javascript:') return false;
        return true;
    }
    n_to_open = 0;
    dl = document.links;
    dll = dl.length;
    for (i = 0; i < dll; ++i) {
        if (linkIsSafe(dl[i].href))++n_to_open;
    }
    if (!n_to_open) alert('no links');
    else {
        if (confirm('Open ' + n_to_open + ' links in new windows?')) for (i = 0; i < dll; ++i) if (linkIsSafe(dl[i].href)) window.open(dl[i].href);
    }
})();

Обуревает блажь изменить его таким образом, чтобы открывалась ссылка с каким-либо определённым текстом. Прошу в этом посильно помочь.

2

Re: JS+bookmarklet+Opera: Открыть ссылку, содержащую определенное слово

DD пишет:

ссылка с каким-либо определённым текстом

критерий "определенности" текста?

( 2 * b ) || ! ( 2 * b )

3

Re: JS+bookmarklet+Opera: Открыть ссылку, содержащую определенное слово

Прошу:

script-coding

4

Re: JS+bookmarklet+Opera: Открыть ссылку, содержащую определенное слово


...
    function linkIsValid(u) {
        return u.indexOf('script-coding') != -1;
    }
...
        if (linkIsSafe(dl[i].href)&&linkIsValid(dl[i].href))++n_to_open;
...
        if (confirm('Open ' + n_to_open + ' links in new windows?')) for (i = 0; i < dll; ++i) if (linkIsSafe(dl[i].href)&&linkIsValid(dl[i].href)) window.open(dl[i].href);
( 2 * b ) || ! ( 2 * b )

5 (изменено: DD, 2012-03-07 01:47:14)

Re: JS+bookmarklet+Opera: Открыть ссылку, содержащую определенное слово

Я его правильно собрал? —

javascript: (function () {
    var n_to_open, dl, dll, i;

    function linkIsValid(u) {
        return u.indexOf('script-coding') != -1;
    }
    n_to_open = 0;
    dl = document.links;
    dll = dl.length;
    for (i = 0; i < dll; ++i) {
        if (linkIsSafe(dl[i].href)&&linkIsValid(dl[i].href))++n_to_open;
    }
    if (!n_to_open) alert('no links');
    else {
        if (confirm('Open ' + n_to_open + ' links in new windows?')) for (i = 0; i < dll; ++i) if (linkIsSafe(dl[i].href)&&linkIsValid(dl[i].href)) window.open(dl[i].href);
    }
})();

То бишь:

javascript: (function () {     var n_to_open, dl, dll, i;      function linkIsValid(u) {         return u.indexOf('script-coding') != -1;     }     n_to_open = 0;     dl = document.links;     dll = dl.length;     for (i = 0; i < dll; ++i) {         if (linkIsSafe(dl[i].href)&&linkIsValid(dl[i].href))++n_to_open;     }     if (!n_to_open) alert('no links');     else {         if (confirm('Open ' + n_to_open + ' links in new windows?')) for (i = 0; i < dll; ++i) if (linkIsSafe(dl[i].href)&&linkIsValid(dl[i].href)) window.open(dl[i].href);     } })();

А то не фурычит.

6 (изменено: stir, 2012-03-07 07:20:11)

Re: JS+bookmarklet+Opera: Открыть ссылку, содержащую определенное слово

function () {
    var n_to_open, dl, dll, i;
 
    function linkIsValid(u) {
        return u.indexOf('script-coding') != -1;
    }
    n_to_open = 0;
    dl = document.links;
    dll = dl.length;
    for (i = 0; i < dll; ++i) {
        if (linkIsSafe(dl[i].href)&&linkIsValid(dl[i].href))++n_to_open;
    }
    if (!n_to_open) alert('no links');
    else {
        if (confirm('Open ' + n_to_open + ' links in new windows?')) for (i = 0; i < dll; ++i) if (linkIsSafe(dl[i].href)&&linkIsValid(dl[i].href)) window.open(dl[i].href);
    }
}

Функциям обычно необходимы переменные (переданные их значения) в скобках для исполнения функции.. здесь их нет, ну и т.д.
Работоспособность скрипта не проверил из-за отсутствия понимания странного для меня условия в скрипте, .
var n_to_open, dl, dll, i - можно не перечислять, а сразу присваивать значения .. Для универсальности скрипта можно искомую текстовую фразу передавать как переменную в функцию.
Условия невыполнены:
if (условие) оператор1
a && b это Логическое AND, а эталона для сравнения я не увидел..
Например всем известная функция правильно написана:

function validate(obj, low, high) {
    if ((obj.value < low) || (obj.value > high))
    alert("Введено недопустимое значение!")
}

linkIsSafe(dl[i].href)&&linkIsValid(dl[i].href)

смотрю уже на это 30 минут, может я чего не знаю.. сдаюсь! linkIsSafe - не знаю что это такое.

Может логику скрипта изменить?
Например:
Ищем то что удовлетворяет условию и записываем в массив, если ничего не нашли - выводим сообщение об этом, иначе создаем на странице из значений массивов ссылки (вывод построчно денлаем). Тогда код немного изменится. Поиск лучше сделать из регулярки, имхо.

Любители построили Ковчег, а профессионалы - Титаник.

7 (изменено: stir, 2012-03-07 09:56:47)

Re: JS+bookmarklet+Opera: Открыть ссылку, содержащую определенное слово

в приведенном ниже варианте можно значение переменной сохранить в файл, заменив символ перехода на новую строку...
"<br>" на '\n'
Вот модуль записи данных:

//запись данных в файл
function write2(xname,s){
var fso2 = new ActiveXObject("Scripting.FileSystemObject"); 
    var f2 = fso2.CreateTextFile(xname, 1, false);
    f2.Close();
    var f2 = fso2.OpenTextFile(xname, 2, true);
    f2.WriteLine(s);
    f2.Close();    
}
Любители построили Ковчег, а профессионалы - Титаник.

8 (изменено: stir, 2012-03-07 09:46:34)

Re: JS+bookmarklet+Opera: Открыть ссылку, содержащую определенное слово

вот набросал как вариант (не полный, проверить тоже некогда):

 var dl = new array(); //содержит все ссылки
var sea = 'script-coding'; //искомое слово, его можно вводить с помощью диалога в форме, если подумать над кодом...

// тут должна быть часть кода, которая вносит ссылки в массив dl 

//наша функция для отделения нужных ссылок
function xxx (dl, sea){
var n= 0;
var re='^'+'*'+sea+'*'+'$';
//var linkIsSafe = new array();// если надо, как вариант 2
var s='';//если выбрали 2 вариант, тогда эту переменную не используйте. она для 1 варианта.

for (i = 0; i < dl.length; ++i) {
     if (!RegExp(re).test(dl[i])){
    //linkIsSafe[n]=dl[i];// если выбрали вариант 2
    ++n;
     s += dl[i].link(dl[i])+ "<br>";//по умолчанию как вариант 1
    }
 }

    if (n==0) alert('no links');
    else {
        if (confirm('Показать найденные ссылки, ' + n+ ' шт.?')) 
        document.write(s);//здесь можно как угодно вывести данные, приведено для 1 варианта
    }
}

незнаю как опера сможет сохранять найденное в массив.. поэтому приведена заключительная часть кода.

Любители построили Ковчег, а профессионалы - Титаник.

9

Re: JS+bookmarklet+Opera: Открыть ссылку, содержащую определенное слово

Ого! Тут мне корму на три года .
На ту же тему, — с той разницей, что окрасит найденные ссылки со словом "coding" в желтый цвет:

javascript:function hiliteUrls(wndw){for(pf8s=0;pf8s<wndw.document.links.length;pf8s++){void(lnk3=wndw.document.links[pf8s]);if(lnk3.href.indexOf(answ1)!=-1){void(lnk3.style.backgroundColor='yellow');tot2++;}}}var answ1="coding";if(answ1!=null&&answ1!=''){var tot2=0;void(frms=window.frames);if(frms.length==0){hiliteUrls(window);}else{for(iQA=0;iQA<frms.length;iQA++){hiliteUrls(frms[iQA]);}}alert(tot2+' link(s) found containing \''+answ1+'\'.');}

То ж:


javascript: function hiliteUrls(wndw) {
    for (pf8s = 0; pf8s < wndw.document.links.length; pf8s++) {
        void(lnk3 = wndw.document.links[pf8s]);
        if (lnk3.href.indexOf(answ1) != -1) {
            void(lnk3.style.backgroundColor = 'yellow');
            tot2++;
        }
    }
}
var answ1 = "coding";
if (answ1 != null && answ1 != '') {
    var tot2 = 0;
    void(frms = window.frames);
    if (frms.length == 0) {
        hiliteUrls(window);
    } else {
        for (iQA = 0; iQA < frms.length; iQA++) {
            hiliteUrls(frms[iQA]);
        }
    }
    alert(tot2 + ' link(s) found containing \'' + answ1 + '\'.');
}

10

Re: JS+bookmarklet+Opera: Открыть ссылку, содержащую определенное слово

о!

javascript: (function () { var i, l = document.links; for (i = 0; i < l.length; ++i) {if (l[i].href.match(/http.*script-coding.*/)) {window.open(l[i].href);}}})();
Нас невозможно сбить с пути, нам пофигу куда идти.

11

Re: JS+bookmarklet+Opera: Открыть ссылку, содержащую определенное слово

stir пишет:

linkIsSafe(dl[i].href)&&linkIsValid(dl[i].href)

смотрю уже на это 30 минут, может я чего не знаю.. сдаюсь! linkIsSafe - не знаю что это такое.

Дык это функция которая была в изначальном скрипте, но потом почему то исчезла. Rumata написал правильный код, но не разжевал. Поэтому DD недумая склеил.

DD повдумчивей попробуйте.

Нас невозможно сбить с пути, нам пофигу куда идти.

12 (изменено: DD, 2012-03-16 10:37:30)

Re: JS+bookmarklet+Opera: Открыть ссылку, содержащую определенное слово

Да дык с Вашей подсказкой и вдумываться специально не пришлось .
Спасибо всем!

Эх, Витьку жалко — спился!

13

Re: JS+bookmarklet+Opera: Открыть ссылку, содержащую определенное слово

Ну, можно и такой вариант, более короткий:

javascript:for(var i=0,lns=document.links,l=lns.length,e;i<l;i++)if(/script-coding/.test(e=lns[i].href))open(e);

14

Re: JS+bookmarklet+Opera: Открыть ссылку, содержащую определенное слово

2JSman
Годится!

А тут, видите ли, как-то незаметно, сама собой новая назрела насущность: открытие найденной ссылки (это может быть первая же ссылка) в том же окне — не в новом.

15

Re: JS+bookmarklet+Opera: Открыть ссылку, содержащую определенное слово

Как вам помочь пока еще не думал.. но у меня все найденные ссылки вываливаются в список - щелкай не хочу любую.. при небольшой доработке их можно разбивать постранично и т.д.

имхо, делаю всегда общий код модулями (кусками) для удобства внесения изменений после обкатки...

ВСЕ - УРА, я иду в отпуск, но обещаю заглядывать сюда иногда!!!

Любители построили Ковчег, а профессионалы - Титаник.