getElementbyId在服务器上返回null,但在我的本地wamp上工作良好


getElementbyId returns null on server but works fine on my local wamp

当运行这个php脚本时:

$doc = new DOMDocument();
$doc->loadHTMLFile("../counter.html");
$ele2 = $doc->getElementById ( "coupon_id" );
if($ele2){
    $ele2->nodeValue = $result["coupon_code"];
}
$response["list"]= $doc->saveHTML();

$ele2在我的web服务器上被发现为null,所以它没有进入if条件,但它在我的本地服务器上工作得很好。这是我的counter.html文件:

  <div class="panel panel-success">
    <div class="panel-heading">
      <h3 id="coupon" class="panel-title">Coupon name 1</h3>
    </div>
<p id="coupon_id" hidden>coupon id</p>
    <div id="counter-up" class="panel-body">
      0
    </div>
  </div>

我已经通过以下操作确保了html文件被成功加载:echo "<pre>".$doc->saveHTML()."</pre>";

来自文档:

要使这个函数工作,您需要使用DOMElement::setIdAttribute设置一些ID属性,或者使用DTD将属性定义为ID类型。在后面的[sic]情况下,您需要在使用此函数之前使用DOMDocument::validate或DOMDocument::$validateOnParse验证文档。

由于没有定义DTD,因此可以在加载HTML文件之前添加$doc->validateOnParse = true;。这应该针对HTML DTD进行验证,并设置适当的ID属性。

如果这对您不起作用,在用户贡献的注释中提到了一个后备解决方案:

$xpath = new DOMXPath($doc);
$ele2 = $xpath->query("//*[@id='coupon_id']")->item(0);

添加p> @ $ doc-> loadHTML ('<? xml encoding = "UTF-8"> <! DOCTYPE html PUBLIC "- // W3C // DTD HTML 4.0 Transitional // EN" "http://www.w3.org/ TR / REC-html40 / loose.dtd "> '. $ html);