您如何向知道其所包含概念的人(例如函数,变量等)解释JavaScript闭包,但不了解闭包本身?
我已经看过维基百科上给出的Scheme示例,但遗憾的是它并没有帮助.
我想v=id从JavaScript 获取YouTube的URL(没有jQuery,纯JavaScript).
http://www.youtube.com/watch?v=u8nQa1cJyX8&a=GxdCwVVULXctT2lYDEPllDR0LRTutYfW
http://www.youtube.com/watch?v=u8nQa1cJyX8
或者在网址中包含视频ID的任何其他YouTube格式.
u8nQa1cJyX8
如何编写将在URL锚点的任何更改上执行的JavaScript回调代码?
javascript event-handling fragment-identifier dom-events hashchange
为什么
$(function () {
$(window).bind('popstate', function () {alert('pop');});
window.history.pushState(null, '', '/foo');
});
Run Code Online (Sandbox Code Playgroud)
不警惕pop?
注意:测试最新的chrome
-
据MDN称:
每次活动历史记录条目更改时,都会将popstate事件分派到窗口.如果正在激活的历史记录条目是通过调用pushState创建的或受对replaceState的调用影响而创建的,则popstate事件的state属性包含历史记录条目的状态对象的副本.
那么为什么我pushState不会触发这个popstate事件呢?
我的Google-fu什么都没有.
当你这样做:
var stateObj = { state: "some state" };
history.pushState(stateObj, "page 2", "other.htm");
Run Code Online (Sandbox Code Playgroud)
是否有关联的窗口回调?
我知道有这个:
window.onpopstate = function() {
}
Run Code Online (Sandbox Code Playgroud)
当用户点击后退按钮时,这非常适合收听.但是,我想在任何时候听到URL的变化,我不知道该怎么做.
URL随时更改时是否存在全局回调?
解决方案应该是纯Javascript - 没有外部库和框架.
在SPA中,Everything使用路由机制进行路由.我只是想听到一个网址的任何部分发生变化(不仅是哈希.我想要检测的任何变化)
以下是SPA的例子,
https://www.google.in/
https://www.google.in/women
https://www.google.in/girl
Run Code Online (Sandbox Code Playgroud)
现在每当网址从https://www.hopscotch.in/更改为https://www.hopscotch.in/women时,我想捕获该事件.
我试过了,
window.addEventListener("hashchange",function(event){
console.log(this); // this gets fired only when hash changes
});
Run Code Online (Sandbox Code Playgroud) 我有一个带有分页和过滤器的单页应用程序,需要检测当前 URL 何时发生变化。有没有一种简单的方法可以将侦听器添加到当前 URL 并在它更改时触发某些内容?(也没有设置间隔!)
我试过 onhashchange 和 unbeforeunload,两者都与此无关。
window.onbeforeunload = function(e) {
alert ('url changed!');
};
window.onhashchange = function() {
alert ('url changed!');
}
Run Code Online (Sandbox Code Playgroud)
有没有办法向 URL 添加侦听器,并在它发生任何变化时触发某些内容?(再次,单页应用程序,所以没有刷新)
我有一个用户脚本(用于Chrome),我用它来为我设计duolingo的练习页面.它只应用了一行css
jQ(document).ready(function(){
jQ('#start-button').css({"float": "left", "margin-right": "10em"});
});
Run Code Online (Sandbox Code Playgroud)
这是我第一次来到页面时工作得很好.但他们使用Ajax来避免页面重新加载.并且url 确实发生了变化,因此如果我检测到这一点,我可以刷新css更改而不会丢失此网站导航模式的格式.
有人碰巧知道检测它的好方法吗?
编辑:完整的用户脚本实现了几个首先指出的流行解决方案(这是行不通的):
// ==UserScript==
// @name duolingo
// @namespace http://your.homepage/
// @version 0.1
// @description reformat /skills to not start timed practice by default
// @author You
// @include /^https?\:\/\/www\.duolingo\.com\/(skill|practice)?\/?.*/
// @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js
// @grant none
// ==/UserScript==
window.jQ=jQuery.noConflict(true);
jQ(document).ready(function(){
style_duolingo();
});
jQ(window).bind('hashchange', function() {
style_duolingo();
});
jQ(document).ajaxComplete(function() {
style_duolingo();
});
function style_duolingo() {
jQ('#start-button').css({"float": "left", "margin-right": "10em"});
console.log("Tampermonkey script: wrote css change");
}
Run Code Online (Sandbox Code Playgroud)
编辑#2:
请提供一个不加载外部库的工作解决方案(我想知道我缺少什么,而不是将其保存在黑盒子中),并使用事件解决问题(没有基于间隔的解决方案).如果无法使用事件(奇怪),请提供更正解决方案以及未触发事件的原因.
我想听听不是我维护的 SPA 中的路径变化。
我在这里找到了一个解决方案:https : //stackoverflow.com/a/44819548/7042552
但是,对我来说似乎有点“hacky” - 但我的实现仍然是这样的:
let url = window.location.href;
['click','popstate', 'onload'].forEach( evt =>
window.addEventListener(evt, function () {
requestAnimationFrame(()=>{
if (url !== location.href) {
// do stuff
}
url = location.href;
});
}, true)
);
Run Code Online (Sandbox Code Playgroud)
是否有更好或更通用的方法来监听 SPA 中的页面加载?
我正在撰写Chrome扩展程序,因此我需要能够收听YouTube网址中的更改(即,看到您切换了视频).YouTube使这很难,因为HTML5视频播放器没有完整的页面重新加载,没有更改URL片段(不能像其他答案所建议的那样监听hashchange事件).听pushState也不起作用.我花了很多时间在这里寻找答案,以及迄今为止我见过的所有答案(除了一个 - 我真的不想使用)不起作用.
我见过的唯一答案是设置超时以每秒运行一次以查看URL是否发生了变化(丑陋!).
编辑:可能重复的问题是一个完全不同的问题 - 一个处理收听URL更改另一个涉及获取扩展加载.
问题:如何在不轮询的情况下检测YouTube HTML5视频播放器中的网址更改?
javascript ×8
html5 ×3
dom-events ×2
jquery ×2
youtube ×2
ajax ×1
closures ×1
function ×1
hashchange ×1
history.js ×1
listener ×1
regex ×1
scope ×1
url ×1
variables ×1