Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果无法访问服务器,JS将更改图像/视频src_Javascript_Html_Firewall - Fatal编程技术网

Javascript 如果无法访问服务器,JS将更改图像/视频src

Javascript 如果无法访问服务器,JS将更改图像/视频src,javascript,html,firewall,Javascript,Html,Firewall,问:我对一个小的javascript代码感兴趣,该代码检查用户是否有权访问Smugmug.com,如果没有,则将图像源更改为其他服务器,并计划使用视频实现此功能,但此示例仅使用图像。将有一个Smugmug检查,在同一html页面上有多个源代码更改。我已经准备好测试这一点。当我将smugmug.com/favicon.ico更改为smug1234mug.com/favicon.ico时,代码不会更改源图像 HTML: 从我看来,你有两个问题。第一个是关于使用triple equals==的小问题,

问:我对一个小的javascript代码感兴趣,该代码检查用户是否有权访问Smugmug.com,如果没有,则将图像源更改为其他服务器,并计划使用视频实现此功能,但此示例仅使用图像。将有一个Smugmug检查,在同一html页面上有多个源代码更改。我已经准备好测试这一点。当我将smugmug.com/favicon.ico更改为smug1234mug.com/favicon.ico时,代码不会更改源图像

HTML:


从我看来,你有两个问题。第一个是关于使用triple equals==的小问题,triple equals运算符不仅检查值相等,而且检查类型相等

因为在值声明、onload和onerror函数中使用字符串,在if语句中使用数字,所以条件永远不会为true,因为1==1为false。您可以将条件更改为字符串,也可以只使用普通的双等于

您遇到的第二个问题有点复杂,这是由于各种事件被触发的时间,您编写的代码只有在事件按特定顺序触发时才能工作,changeImage函数依赖于在调用ISSMUG时正确设置ISSMUG,如果在SMimage加载或未加载之前调用changeImage,ISSMUG将仍然是默认值1

下面是第二个问题的解决方案示例:

// check if SmugMug is reachable (run once only)
var isSmugMug = "1";
var smugMugChecked = false;

var SMimage = new Image();
SMimage.onload = function(){
    window.isSmugMug = "1";
    smugMugChecked = true;
// The user can access SmugMug
};
SMimage.onerror = function(){
// The user can't access SmugMug
    window.isSmugMug = "0";
    smugMugChecked = true;
};
SMimage.src = "http://smugmug.com/favicon.ico";


function changeImage(p1,p2) {
    var checkInterval = setInterval(function(){
        if (smugMugChecked == true) {
            clearInterval(checkInterval);
            if (window.isSmugMug==0) {
                document.getElementById(p1).src=p2;
            }
        }
    }, 500);
}

在这里,我添加了一个变量来保存SMimage检查是否已完成的状态,changeImage使用500毫秒的间隔计时器来等待SMimage检查完成,检查完成后,移除计时器并更改图像。这不是一个完美的解决方案,尤其是如果你在一页上有很多这样的检查。

上面的内容看起来足够接近了。出什么问题了?它坏了。当我将smugmug favicon地址更改为明显不存在的地址时,对图像src没有影响。它没有加载我刚才注意到的第二个链接window.isSmugMug==0将永远不会为真,因为window.isSmugMug总是设置为字符串,而不是数字。我有点认为JS会在html加载之前先运行。所有图像的延迟只有500毫秒,而不是每个图像。在调用change source函数之前,有没有办法强制加载favicon/check?
// check if SmugMug is reachable (run once only)
var isSmugMug = "1";

var SMimage = new Image();
SMimage.onload = function(){
    window.isSmugMug = "1";
// The user can access SmugMug
};
SMimage.onerror = function(){
// The user can't access SmugMug
    window.isSmugMug = "0";
};
SMimage.src = "http://smugmug.com/favicon.ico";


function changeImage(p1,p2) {

    if (window.isSmugMug===0) {
        document.getElementById(p1).src=p2;
    }

}
// check if SmugMug is reachable (run once only)
var isSmugMug = "1";
var smugMugChecked = false;

var SMimage = new Image();
SMimage.onload = function(){
    window.isSmugMug = "1";
    smugMugChecked = true;
// The user can access SmugMug
};
SMimage.onerror = function(){
// The user can't access SmugMug
    window.isSmugMug = "0";
    smugMugChecked = true;
};
SMimage.src = "http://smugmug.com/favicon.ico";


function changeImage(p1,p2) {
    var checkInterval = setInterval(function(){
        if (smugMugChecked == true) {
            clearInterval(checkInterval);
            if (window.isSmugMug==0) {
                document.getElementById(p1).src=p2;
            }
        }
    }, 500);
}