Многие сайты используют AJAX для динамического добавления / отображения / изменения контента. Иногда он используется вместо навигации по сайту, поэтому текущий URL-адрес изменяется программно, а сценарии содержимого в этом случае автоматически не выполняются браузером, так как страница не извлекается с удаленного сервера целиком.
pjax:end
в document
, используемое многими сайтами на основе pjax, например. GitHub, см. Как запустить jQuery до и после загрузки pjax? message
на window
, используемом, например, Поиск Google в браузере Chrome, см. Расширение Chrome обнаруживает обновление поиска Google spfdone
в document
, используемое Youtube, см. . Как определить навигацию по страницам на Youtube и изменять HTML до отображения страницы? document.head.appendChild(document.createElement('script')).text = '(' +
function() {
// injected DOM script is not a content script anymore,
// it can modify objects and functions of the page
var _pushState = history.pushState;
history.pushState = function(state, title, url) {
_pushState.call(this, state, title, url);
window.dispatchEvent(new CustomEvent('state-changed', {detail: state}));
};
// repeat the above for replaceState too
} + ')(); this.remove();'; // remove the DOM script element
// And here content script listens to our DOM script custom events
window.addEventListener('state-changed', function(e) {
console.log('History state changed', e.detail, location.hash);
doSomething();
});
window.addEventListener('hashchange', function(e) {
console.log('URL hash changed', e);
doSomething();
});
window.addEventListener('popstate', function(e) {
console.log('State changed', e);
doSomething();
});
Для работы с навигацией существует расширенный API: webNavigation , webRequest , но мы будем использовать простой chrome.tabs.onUpdated прослушиватель событий, который посылает сообщение к скрипту содержимого:
"tabs"
разрешено . var rxLookfor = /^https?:\/\/(www\.)?google\.(com|\w\w(\.\w\w)?)\/.*?[?#&]q=/;
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
if (rxLookfor.test(changeInfo.url)) {
chrome.tabs.sendMessage(tabId, 'url-update');
}
});
chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
if (msg === 'url-update') {
doSomething();
}
});
Статья "Server-side JavaScript" Википедии перечисляет многочисленные реализации, многие из которых основаны на Носороге Mozilla преобразователь JavaScript к Java или его кузен SpiderMonkey (тот же механизм, как найдено в Firefox и других Основанных на гекконе браузерах). В частности, что-то простое как mod_js для Apache может удовлетворить Вашим потребностям.
Если Вы просто используете простой JS, Носорог должен добиться цели. Но если код JS на самом деле называет методы DOM и так далее, Вы испытываете необходимость в полноценном браузере. Лом мог бы помочь Вам.
Это действительно собирается сделать вещи быстрее для пользователей, не вызывая проблемы совместимости?
Существует Обеспечение John Resig проекта Браузера к Серверу: "Среда browser/DOM, записанная в JavaScript, который работает сверху Носорога; способный к под управлением jQuery, Прототипу и MochiKit (по крайней мере)".