Мне нужно обновить страницу для запуска скрипта Greasemonkey?



Так что я знаю, что это как-то связано с AJAX, но я прочитал несколько тем и не совсем понимаю, что я должен делать. В настоящее время все работает нормально, но мне нужно обновить страницу для запуска моего сценария. Что нужно сделать с моим кодом, чтобы заставить его работать без обновления?



// ==UserScript==
// @name Job Aids
// @description Aid in closing tickets
// @include https://techaccess.ad.qintra.com/WorkJobs/WorkJobs.aspx*
// @namespace camzilla.net
// @version 1.1.20121128
// ==/UserScript==

var url = window.location.href.split(".aspx");
var page = url[1].toLowerCase();

if (page == "#finaltest") {
window.addEventListener ("load", finalResults, false);
} else if (page == "#threetoneslope") {
window.addEventListener ("load", toneSlopeResults, false);
} else if (page == "#codes") {
window.addEventListener ("load", closingComments, false);
} else if (page == "#cras") {
window.addEventListener ("load", crasResults, false);
} else if (page == "#jobinfo") {
window.addEventListener ("load", addLinks, false);
} else if (page == "") {
if (getCookie("updater") == null) {
var d = new Date();

setCookie("updater", d.getTime(), 1);
try {
updateCheck();
} catch(err) {
// alert('Update checking failed');
}
}

// setTimeout(promptDispatch, 1000);
}

function addLinks() {
var mydiv = document.querySelector('div[data-bind="CurrentJob.addr"]');
var address = 'https://maps.google.com/maps?q=' + mydiv.textContent + ", UT";
address.replace(/ /g, '+');
var a = document.createElement("a");
var txt = document.createTextNode(mydiv.textContent);
mydiv.textContent = "";
a.appendChild(txt);
a.href = address;
a.target = '_blank';
mydiv.appendChild(a);

mydiv = document.querySelector('div[data-bind="CurrentJob.cktid"]');
address = 'http://acmspjv1.interprise.com/cgi-bin/QC/DSL/dslam6100Int.pl?telephoneNum=';
address+= mydiv.textContent;
a = document.createElement("a");
txt = document.createTextNode(mydiv.textContent);
mydiv.textContent = "";
a.appendChild(txt);
a.href = address;
a.target = '_blank';
mydiv.appendChild(a);
}

function updateCheck() {
try {
GM_xmlhttpRequest(
{
method: 'GET',
url: 'http://camzilla.net/downloads/jobAids.user.js?v' + getCookie("updater"),
headers: {'Cache-Control': 'no-cache'},
onload: function(resp) {
var local_version, remote_version, rt, script_name;

rt = resp.responseText;
remote_version = (/@versions*(.*?)s*$/m.exec(rt)[1]);
local_version = GM_info.script.version;

if (remote_version != local_version) {

if(confirm(GM_info.script.name+' update v'+remote_version+ ' is available.nWould you like to install it now?')) {
GM_openInTab('http://camzilla.net/downloads/jobAids.user.js');
} else {
alert('You will be reminded again tomorrow');
}
}
}
});
} catch(err) {
// do something here
}
}

function setCookie(c_name, value, exdays) {
var exdate=new Date();
exdate.setDate(exdate.getDate() + exdays);
var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
document.cookie=c_name + "=" + c_value;
}

function getCookie(c_name) {
var i,x,y,ARRcookies=document.cookie.split(";");

for (i=0;i<ARRcookies.length;i++) {

x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
x=x.replace(/^s+|s+$/g,"");

if (x==c_name) {
return unescape(y);
}
}

return null;
}

function finalResults() {
var dc, current, loss, noise, pi, lb;

dc = getRandom(51, 49, 2);
current = getRandom(37, 29, 2);
loss = getRandom(7, 2, 2);
noise = getRandom(7, 1, 2);
pi = getRandom(67, 60, 2);
lb = getRandom(79, 70, 2);

document.getElementById('finalTestInsightNo').click();

document.getElementById("finalTestBeforeAcTg").value = "0.00";
document.getElementById("finalTestBeforeAcRg").value = "0.00";
document.getElementById("finalTestBeforeAcTr").value = "0.00";
document.getElementById("finalTestBeforeDcTr").value = dc;
document.getElementById("finalTestBeforeDcTg").value = "0.00";
document.getElementById("finalTestBeforeDcRg").value = dc;
document.getElementById("finalTestBeforeLoopCurrent").value = current;
document.getElementById("finalTestAfterLoss").value = loss;
document.getElementById("finalTestAfterNoise").value = noise;
document.getElementById("finalTestAfterPi").value = pi;
document.getElementById("finalTestAfterLb").value = lb;

document.getElementById("finalTestAfterLb").focus();
window.scrollTo(0, document.body.scrollHeight-250);

// Store cookies to be used on cras page if needed
setCookie("loss", loss, 1);
setCookie("pi", pi, 1);
setCookie("current", current, 1);
setCookie("noise", noise, 1);
setCookie("lb", lb, 1);
}

function crasResults() {
document.getElementById("crasCircuitLoss").value = getCookie("loss");
document.getElementById("crasPowerInfluence").value = getCookie("pi");
document.getElementById("crasLineCurrent").value = getCookie("current");
document.getElementById("crasCircuitNoise").value = getCookie("noise");
document.getElementById("crasBalance").value = getCookie("lb");

document.getElementById('crasFoundInF2').click();
}

function toneSlopeResults() {
var dc = getRandom(51, 49, 2);

document.getElementById("ToneSlopeInsightNo").click();
document.getElementById("ToneSlopeDmarcTaggedYes").click();
document.getElementById("ToneSlopeClecDtPresentYes").click();

document.getElementById("ToneSlopeBeforeDcTr").value = dc;
document.getElementById("ToneSlopeBeforeDcTg").value = "0.00";
document.getElementById("ToneSlopeBeforeDcRg").value = dc;
document.getElementById("ToneSlopeRingbackTr").value = getRandom(90,85,2);
document.getElementById("ToneSlopeAfterResistTg").value = getRandom(998,20,0);
document.getElementById("ToneSlopeAfterResistRg").value = getRandom(998,20,0);
document.getElementById("ToneSlopeAfterResistTr").value = getRandom(998,20,0);

document.getElementById("ToneSlopeAfter404").value = "0.00";
document.getElementById("ToneSlopeAfter1004").value = getRandom(7, 3, 2);
document.getElementById("ToneSlopeAfter2804").value = "0.00";
document.getElementById("ToneSlopeAfterNoise").value = getRandom(7, 1, 2);
document.getElementById("ToneSlopeAfterLb").value = getRandom(79, 70, 2);
document.getElementById("ToneSlopeCotName").value = "NA";

document.getElementById("ToneSlopeTn").focus();
}

function closingComments() {
document.getElementById("flatRateJacks").value = "0";
document.getElementById("rewiredJacks").value = "0";

document.getElementById("tripNo").click();
document.getElementById("marketMass").click();
document.getElementById("custTypeRes").click();
document.getElementById("pairChangeNo").click();
document.getElementById("tempDropNo").click();
document.getElementById("goodCbrYes").click();

document.getElementById("jobCloseComments").focus();
window.scrollTo(0, 5000);
}

function getRandom(max, min, tenths) {
var result = min + (Math.random() * (max - min + 1));
return result.toFixed(tenths);
}
468   2  

2 ответов:

Смотрите " addEventListener работает только при обновлении страницы?" для получения дополнительной информации и аналогичного сценария.

Элементы страницы, которые ожидает ваш скрипт, без сомнения, появляются после запуска события load. Кроме того, из ваших комментариев кажется, что целые разделы страницы заменяются AJAX,но AJAX достаточно вежлив, чтобы изменить хэш URL. Это означает, что вы захотите запустить событие hashchange.

Не используйте addEventListener ("load"... в этом случае. Используйте утилита waitForKeyElements () в сочетании с hashchange.

Без рефакторинга всего скрипта для использования jQuery (что дало бы более четкий и надежный код), замените все, что было перед function addLinks() {..., на:

// ==UserScript==
// @name        Job Aids
// @description Aid in closing tickets
// @include     https://techaccess.ad.qintra.com/WorkJobs/WorkJobs.aspx*
// @namespace   camzilla.net
// @version     1.1.20121128
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require     https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant       GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

//-- Pages are "loaded" via AJAX...
window.addEventListener ("hashchange", fireOnNewPage,  false);

waitForKeyElements ("#crasCircuitLoss",                 crasResults);
waitForKeyElements ("#finalTestInsightNo",              finalResults);
waitForKeyElements ("#flatRateJacks",                   closingComments);
waitForKeyElements ("#ToneSlopeInsightNo",              toneSlopeResults);
waitForKeyElements ("div[data-bind="CurrentJob.addr"]", addLinks);

function fireOnNewPage () {
    switch (location.hash.toLowerCase() ) {
        case "#finaltest":
        case "#threetoneslope":
        case "#codes":
        case "#cras":
        case "#jobinfo":
            //-- No action needed, waitForKeyElements() handles this.
        break;
        default:
            if (getCookie("updater") == null) {
                var d = new Date();

                setCookie("updater", d.getTime(), 1);
                try {
                    updateCheck();
                } catch(err) {
                    // alert('Update checking failed');
                }
            }
        break;
    }
}
fireOnNewPage ();   //-- Initial run on initial, full page load.

Проверьте некоторые примеры ajax через сеть, выполнив поиск. например: http://www.w3schools.com/ajax/ajax_examples.asp

[2]}AJAX, или (A)синхронный (J)avascript (A)nd (X)ML (который, что интересно, имеет тенденцию использовать JSON больше в наши дни), - это система, в которой Javascript использует объект браузера для связи с удаленным сервером. Обычно это делается для того, чтобы иметь возможность обновить интерфейс клиента, не переходя на другую страницу. Однако прежде чем мы начнем, несколько слова предостережения.

Ajax не рекомендуется использовать для проверки подлинности входа и отправки форм Пользователи могут отключить Javascript или могут быть ограничены в запуске Javascript из-за ИТ-политик

Учитывая это, рекомендуется не использовать AJAX в качестве единственного решения для критически важных пользовательских функций! Всегда есть запасной вариант! Примечание: это сообщение сообщества wiki использует JQuery, чтобы показать пример AJAX-вызовов. Это рекомендуется для новичков, так как он скрывает проблемы совместимости браузера создания вызовы AJAX. Пожалуйста, проверьте веб-сайт JQuery для получения дополнительной информации о JQuery.

Примечание: примеры используют связь с сервером PHP, но любой язык на стороне сервера будет работать.

AJAX обратные вызовы

function makeAjaxCall() {
  $.ajax({
    url: 'ajax/test.html',
    success: function(data) {
      alert('Horray the AJAX call succeeded!');
    },
    error: function(xhr, error) {
      alert('Holy errors batman!');
    }
  });
}

Природа вызовов AJAX

Вызовы AJAX могут быть как асинхронными, так и синхронными. Асинхронность означает, что браузер сделает запрос AJAX и продолжит делать другие вещи. Синхронный означает, что браузер будет останавливать то, что он делает, пока вызов AJAX завершает. Вот пример различий в двух кодах wise:
// An asynchronous call
// This is the default
$.ajax({
  url: '/server.php',
  success: function(data) {
    alert('Horray the AJAX call succeeded!');
  },
  error: function(xhr, error) {
    alert('Holy errors batman!');
  }
});
// This will get called right away
myFunction();
Now for a synchronous call:

// A synchronous call
$.ajax({
  url: '/server.php',
  async: false, // set the property here
  success: function(data) {
    alert('Horray the AJAX call succeeded!');
  },
  error: function(xhr, error) {
    alert('Holy errors batman!');
  }
});

Comments

    Ничего не найдено.