Скрипт Greasemonkey не работает, но ошибок нет?

На веб-сайте pib.nic.in/newsite/erelease.aspx , левые ссылки открываются на той же странице - неудобство при чтении и переходе к следующей теме.

Функция с именем Getrelease передавала уникальный идентификатор, соответствующий выбранному элементу, для извлечения и отображения в правом столбце.

Соответствующая страница, фрагмент HTML:

<div class="leftrightdiv" id="lreleaseID">
    <ul class="link1">
        <li style="list-style:none;border-bottom: blue 1px dotted;color:blue;font-size:110%" class="rel">Prime Minister's Office</li>
        <!-- <li class="rel" style="border-bottom: teal 1px dotted;cursor:pointer" **onclick='Getrelease(94318)'** >PM's statement at the BRICS Leaders - Africa Dialogue Forum<span style='font-weight:lighter;color: ThreeDDarkShadow;'> ()</span></li>  -->
        <li onclick="Getrelease(94318)" style="border-bottom: teal 1px dotted;cursor:pointer" class="rel">PM's statement at the BRICS Leaders - Africa Dialogue Forum</li>
        <li style="list-style:none;border-bottom: blue 1px dotted;color:blue;font-size:110%" class="rel">Ministry of Finance</li>
        <!-- <li class="rel" style="border-bottom: teal 1px dotted;cursor:pointer" onclick='Getrelease(94339)' >Central Board of Excise and Customs (CBEC) Offices to Remain open on 29th, 30th & 31stmarch, 2013 ;<span style='font-weight:lighter;color: ThreeDDarkShadow;'> ()</span></li>  -->
        <li onclick="Getrelease(94339)" style="border-bottom: teal 1px dotted;cursor:pointer" class="rel">Central Board of Excise and Customs (CBEC) Offices to Remain open on 29th, 30th &amp; 31stmarch, 2013 ;</li>
        <!-- <li class="rel" style="border-bottom: teal 1px dotted;cursor:pointer" onclick='Getrelease(94338)' >India and Liechtenstein Sign Tax Information Exchange Agreement (TIEA)<span style='font-weight:lighter;color: ThreeDDarkShadow;'> ()</span></li>  -->
        <li onclick="Getrelease(94338)" style="border-bottom: teal 1px dotted;cursor:pointer" class="rel">India and Liechtenstein Sign Tax Information Exchange Agreement (TIEA)</li>
        <!-- <li class="rel" style="border-bottom: teal 1px dotted;cursor:pointer" onclick='Getrelease(94337)' >Government Committed to bring down the Current Account<span style='font-weight:lighter;color: ThreeDDarkShadow;'> ()</span></li>  -->
        <li onclick="Getrelease(94337)" style="border-bottom: teal 1px dotted;cursor:pointer" class="rel">Government Committed to bring down the Current Account</li>
    </ul>
    <br>
</div>


Я хотел изменить приведенное выше на следующий код, чтобы при щелчке по элементу он открывался на новой странице.

<div class="leftrightdiv" id="lreleaseID">
    <ul class="link1">
        <li style="list-style:none;border-bottom: blue 1px dotted;color:blue;font-size:110%" class="rel">Prime Minister's Office</li>
        <!-- <li class="rel" style="border-bottom: teal 1px dotted;cursor:pointer" onclick='Getrelease(94318)' >PM's statement at the BRICS Leaders - Africa Dialogue Forum<span style='font-weight:lighter;color: ThreeDDarkShadow;'> ()</span></li>  -->
        <li onclick="window.open('http://www.pib.nic.in/newsite/erelease.aspx?relid=94318')" style="border-bottom: teal 1px dotted;cursor:pointer" class="rel">PM's statement at the BRICS Leaders - Africa Dialogue Forum</li>
        <li style="list-style:none;border-bottom: blue 1px dotted;color:blue;font-size:110%" class="rel">Ministry of Finance</li>
        <!-- <li class="rel" style="border-bottom: teal 1px dotted;cursor:pointer" onclick='Getrelease(94339)' >Central Board of Excise and Customs (CBEC) Offices to Remain open on 29th, 30th & 31stmarch, 2013 ;<span style='font-weight:lighter;color: ThreeDDarkShadow;'> ()</span></li>  -->
        <li onclick="window.open('http://www.pib.nic.in/newsite/erelease.aspx?relid=94339')" style="border-bottom: teal 1px dotted;cursor:pointer" class="rel">Central Board of Excise and Customs (CBEC) Offices to Remain open on 29th, 30th &amp; 31stmarch, 2013 ;</li>
        <!-- <li class="rel" style="border-bottom: teal 1px dotted;cursor:pointer" onclick='Getrelease(94338)' >India and Liechtenstein Sign Tax Information Exchange Agreement (TIEA)<span style='font-weight:lighter;color: ThreeDDarkShadow;'> ()</span></li>  -->
        <li onclick="window.open('http://www.pib.nic.in/newsite/erelease.aspx?relid=94338')" style="border-bottom: teal 1px dotted;cursor:pointer" class="rel">India and Liechtenstein Sign Tax Information Exchange Agreement (TIEA)</li>
        <!-- <li class="rel" style="border-bottom: teal 1px dotted;cursor:pointer" onclick='Getrelease(94337)' >Government Committed to bring down the Current Account<span style='font-weight:lighter;color: ThreeDDarkShadow;'> ()</span></li>  -->
        <li onclick="window.open('http://www.pib.nic.in/newsite/erelease.aspx?relid=94337')" style="border-bottom: teal 1px dotted;cursor:pointer" class="rel">Government Committed to bring down the Current Account</li>
    </ul>
    <br>
</div>


Так написал этот сценарий Greasemonkey:

// ==UserScript==
// @name            Press Information Bureau
// @namespace       http://userscripts.org/scripts/show/163329
// @description     PIB new tab open
// @include         http://pib.nic.in*
// @require         http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js
// @version         2.4
// ==/UserScript==

function replaceOnclick() {

    var list = document.getElementById('lreleaseID');
    var lists = list.getelementsbytagname('li');

    for (i = 0; i < lists.length; i++) {
        var Str = lists[i].getAttribute("onclick");
        var seconds = Str.indexOf(')');
        var url = "http://www.pib.nic.in/newsite/erelease.aspx?relid=" + Str.substring(11, second);

        lists[i].setAttribute("onclick", "window.open('" + url + "')");
    }
}


Скрипт Greasemonkey внедряется. Но это не приводит к ожидаемым изменениям в выводе.
В чем ошибка использования javascript? Пожалуйста, помогите мне.


person Ranjith Raj    schedule 28.03.2013    source источник


Ответы (1)


В этом сценарии есть несколько ошибок:

  1. Он определяет replaceOnclick(), но никогда его не вызывает. Вот почему вы не видите действий и ошибок в консоли ошибок (Ctrl Shift J).

  2. Неверное имя функции getelementsbytagname вызовет ошибку (исключение). JavaScript чувствителен к регистру, и правильная функция - getElementsByTagName().

  3. Str иногда имеет значение null, поэтому var seconds=Str.indexOf(')'); вызовет исключение и приведет к сбою скрипта. Один из способов предотвратить это - заключить его использование в оператор if (Str) {...}.

  4. Точно так же seconds иногда равно нулю.

  5. Эта строка:

    var url="http://www.pib.nic.in/newsite/erelease.aspx?relid="+Str.substring(11, second);
    

    использует неправильное имя. second должно быть seconds.


Еще несколько пунктов, которые не совсем ошибки, но вы должны делать по-другому ...

  1. Этот сайт по умолчанию использует URL типа http://www.pib.nic.in/newsite/.... Поэтому вы, вероятно, захотите добавить строку включения, чтобы учесть это:

    // @include         http://www.pib.nic.in*
    
  2. Скрипт ссылается на jQuery, но не использует его! Используйте jQuery, и это сэкономит ваше время и горе.

  3. В сценарии не указана директива @grant. Это может вызвать неожиданное поведение и конфликты. Всегда указывайте хотя бы одну @grant строку и не используйте @grant none, если можете этого избежать.

  4. jQuery 1.3.2 "Hella" устарел. Если вы собираетесь использовать jQuery, используйте более свежую версию, если нет веской причины не делать этого.


Используйте указанные выше элементы, чтобы исправить этот сценарий. Или вот как это выглядит при использовании jQuery:

// ==UserScript==
// @name            Press Information Bureau
// @namespace       http://userscripts.org/scripts/show/163329
// @description     PIB new tab open
// @include         http://pib.nic.in*
// @include         http://www.pib.nic.in*
// @require         http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @grant           GM_addStyle
// @version         2.4
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

//-- Use jQuery selector to get just the <li>s that have an onclick.
var articleLinks    = $("#lreleaseID li[onclick]");

//-- jQuery .each()
articleLinks.each ( function () {
    var jThis           = $(this);  // "this" is a special var inside .each()
    var onClickVal      = jThis.attr ("onclick");
    var articleMatch    = onClickVal.match (/Getrelease\s*\((\d+)\)/i);

    if (articleMatch  &&  articleMatch.length == 2) {
        var articleId   = articleMatch[1];
        var articleUrl  = "http://www.pib.nic.in/newsite/erelease.aspx?relid="
                        + articleId
                        ;

        jThis.attr ("onclick", "window.open('" + articleUrl + "')");
    }
} );
person Brock Adams    schedule 29.03.2013
comment
Большое спасибо, Брок Адамс. Я постараюсь исправить свой js, как вы сказали. И я новичок в jQuery. Приведенный вами код отлично работает, когда страница pib.nic .in / newsite / erelease.aspx? relid = 0 загружается. Но когда я выбираю дату, месяц, год, чтобы увидеть старый архив в левой верхней части раскрывающегося списка, и нажимаю ссылку, после этого он не работает - person Ranjith Raj; 29.03.2013
comment
Я попытался выяснить, после изменения раскрывающегося списка значения передаются через функцию WebForm_DoCallback для получения нового содержимого. Но не удалось найти решение для запуска того же jquery после него. Я попросил помощи по ссылке stackoverflow .com / questions / 15703056 / для этого. Если удастся решить, будет большим подспорьем. - person Ranjith Raj; 29.03.2013