Javascript函数img.onload不返回任何内容(true或false)

时间:2016-04-24 16:06:32

标签: javascript function return return-value onload-event



function getMeta() {
  var img = new Image();
  var verif = true;
  img.onload = function() {
    if (this.width != 468 && this.height != 60) {
      alert('error : only these image sizes are accepted : 468x60');
      return false;
    } else
      alert('loaded successfully');
  };
  img.onerror = function() {
    alert('error : this is not a valid image');
    return false;
  };
  img.src = document.getElementById('t1').value;
  return true;
}

<form action="https://www.paypal.com/cgi-bin/webscr" 
      method="post" target="_blank" id="form1" 
      onsubmit="return getMeta();">
&#13;
&#13;
&#13;

函数img.onload不会返回任何内容 我需要返回值true或false。

我想在表单的onsubmit中使用返回值。 有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:0)

一般参考,您应该阅读How do I return the response from an asynchronous call?。这描述了获取异步结果的一般问题。阅读完之后,您将有希望了解为什么您不能仅从.onload()返回一个值并期望它是getMeta()的返回值。但是,这个答案本身并不能为您的具体问题提供完整的解决方案。

因此,现在让我们更详细地描述您的代码中发生了什么,然后讨论修复它的选项。

img.onload是异步的。这意味着它会在getMeta()已经返回很久之后的某个时间结束。

与此同时,你正试图这样做:

onsubmit="return getMeta();"

这使得您看起来像是在尝试使用异步结果来确定表单是否应该提交。那根本不可能那样做。异步结果尚不清楚,您的getMeta()函数始终返回true

您可以重新构建代码,以便它不会同步提交。您加载图像,并且只有在加载图像时,您是向用户显示错误还是手动提交表单。这有潜在的用户界面问题,因为用户点击提交按钮并且没有立即发生任何事情(因为您正在加载图像以进行验证)。这让用户不知道发生了什么。他们通常认为它不起作用,要么再次按下提交按钮,要么认为它刚好坏了。因此,您通常需要一堆UI来禁用该按钮,提供您现在正在验证图像的反馈,然后在图像未验证时提供相应的错误消息,并且通常在您执行时禁用其他UI控件正在验证图像,以便当您正在尝试决定是否要提交此表单时,用户不会离开并执行其他操作。

所以,修复提交:

在你的onsubmit处理程序中,你总是会返回false,因此表单永远不会立即提交。然后,在onload()处理程序中(在图像加载后),您将手动提交表单或显示错误。

答案 1 :(得分:0)

最后,我找到了解决方案,就像所说的jfriend00在成功加载图片时手动提交表单,并将“返回false”添加到“onsubmit”以阻止表单提交时出错。谢谢大家

<script>
function getMeta(){   
    var img = new Image();
    img.onload = function(){
        if (this.width != 468 && this.height != 60)
		  {alert( 'error : only these image sizes are accepted : 468x60' );
		  return false;}
		  
		  else
		  alert( 'loaded successfully' );
		  document.getElementById('form1').submit();
    };
	img.onerror = function() {alert( 'error : this is not a valid image');
	return false;
	 };
    img.src = document.getElementById('t1').value;
	return true;
}
</script>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank" id="form1" onsubmit="getMeta(); return false;">