【问题标题】:Line by line execution for javascript objectjavascript对象的逐行执行
【发布时间】:2015-08-27 09:09:27
【问题描述】:

我正在尝试使用 JavaScript 验证图像 URL 是否存在。基本上,如果有效,我想将 URL 分配给图像。但是验证 URL 的 JavaScript 函数由于没有逐行执行,因此会破坏逻辑并返回所有 URL 为真。有什么方法可以在 urlExists 函数中保留控件,直到其所有线程都完成?

当前控件不等待错误消息的结果,而是总是跳过它返回到调用函数的真值。知道如何让函数在这里保持控制吗?

function urlExists(testUrl) {
    var ret = true;
    var newImage = new Image();
    newImage.src = testUrl;
    $(newImage).error(
        function(){
            ret = false;
        }
    );
    return ret;
}
function changeImagePath(obj){
    var oldUrl = obj.src;
    var newUrl = oldUrl.replace("abc","xyz");
    if(urlExists(newUrl)){
        obj.src = newUrl;
    }   
}

<img src="http://sample.com/images/srpr/logo_abc.png" onclick="changeImagePath(this)" />

还意味着我正在处理跨域图像 URL。

【问题讨论】:

  • 图片加载是异步的,否则,HTTP 请求会阻塞主线程,网站可能会在几秒钟内无响应。您需要使用回调而不是返回值。您可以在 StackOverflow 上找到数千个示例。

标签: javascript asynchronous line-by-line


【解决方案1】:

您可以将代码作为回调函数传入以修改现有图像。无需创建新图像即可执行检查:

function urlExists(img, newUrl, callback) {
  $(img).error(callback).attr('src', newUrl);
}

function changeImagePath(obj) {
  var oldUrl = obj.src;
  var newUrl = oldUrl.replace("200", "x");
  urlExists(obj, newUrl, function() {
    obj.src = oldUrl;
  });
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
Click to attempt to change the image
<img src='https://placekitten.com/g/200/300' alt='cat' onclick='changeImagePath(this);'>

正如您在浏览器的控制台中看到的,HTTP 请求已完成并返回 404 not found。要尝试成功的情况,请将上例中的“x”更改为诸如 250 之类的数字。

【讨论】:

  • 但是无论如何我都会将 url 分配给图像,无论我是否在错误回调函数中将 url 改回以防图像 url 无效??
  • @AakashJain 我已经更新了代码并添加了一个工作示例
  • 与上述答案相关的查询,如果初始图像也无效,则函数进入回调的无限循环。那我们怎么才能把它从循环中打破呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 2017-10-19
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
相关资源
最近更新 更多