Многие сайты используют 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();
}
});
Следующее является примером шаблона, который произвел бы необходимый вывод в XSLT 1.0:
<xsl:template name="getExtension">
<xsl:param name="filename"/>
<xsl:choose>
<xsl:when test="contains($filename, '.')">
<xsl:call-template name="getExtension">
<xsl:with-param name="filename" select="substring-after($filename, '.')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$filename"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="/">
<xsl:call-template name="getExtension">
<xsl:with-param name="filename" select="'http://www.blah.com/path/to/file/media.jpg'"/>
</xsl:call-template>
</xsl:template>
При использовании XSLT 2.0 это легко:
<xsl:variable name="extension" select="tokenize($filename, '\.')[last()]"/>
Если Вы не, это немного более твердо. Из Поваренной книги O'Reilly XSLT существует хороший пример. Поиск "Маркирования Строки".
Я полагаю, что существует также функция EXSLT, если Вы имеете это в наличии.
Как насчет маркируют с "/" и берут последний элемент от массива?
Example: tokenize("XPath is fun", "\s+")
Result: ("XPath", "is", "fun")
Был скрипач XSLT когда-то назад... потерянной связью теперь. Но HTH
Для ссылки эту проблему обычно называют "подстрокой-после-последнего" в XSLT.