2017-11-30 22 views
0

私はhtmlファイルからDOMを解析した後に文字列を返すPHPスクリプトを持っています。私のPHPコードでDOMDocument :: loadHTMLFileを使用するとXMLHttpRequestが非同期モードで動作しない

parserFunctions.php(私はちょうど便利な機能を表示しています):

<?php 
function initPagesToParse($Path){ 
    define('MESSAGES_BY_PAGE', 20); 
    $Docs[0] = new DOMDocument(); 
    $Docs[0]->loadHTMLFile($Path); 
    $numberOfPages = getMessageNumber($Docs[0])/MESSAGES_BY_PAGE; 
    if($numberOfPages > 1){ 
     for($i = 1; $i < $numberOfPages; $i++){ 
      $startPost = $i * MESSAGES_BY_PAGE; 
      $Docs[$startPost] = new DOMDocument(); 
      $Docs[$startPost]->loadHTMLFile($Path . '&start=' . $i); 
     } 
    } 
    return $Docs; 
} 

function runParser($Path){ 
    $Result = ''; 
    foreach(initPagesToParse($Path) as $Doc) { 
     $Result = $Result . getVoteIDsFromDocument($Doc); 
    } 
    if($Result == ''){ 
     return FALSE; 
    } 
    $FileID = uniqid('Vote_IDs_', TRUE); 
    if(file_put_contents ('VoteIDs_files/' . $FileID . '.txt', $Result, LOCK_EX) === FALSE){ 
     return FALSE; 
    } 
    return $FileID; 
} 
?> 

parserMain.php:

<?php 
include 'parserFunctions.php'; 

error_log("Parsing \n"); 

if(!isset($_POST["URL"]) || $_POST["URL"] == null) { 
    echo 'REQ ERROR'; 
    exit(); 
} 

$url = $_POST["URL"]; 

if(($FileID = runParser($url)) === FALSE){ 
    echo 'PARSING ERROR'; 
    exit(); 
} 

error_log($url); 
error_log($FileID); 
echo $FileID; 
?> 

そして、この文字列を取得するために、私はJavaScriptを使用してHTMLページを持っていますXMLHttpRequestを使用して結果を取得します。

<script type="text/javascript"> 
"use strict"; 
function sendUrlToParser() { 
    var handleResponse = function (status, response) { 
     alert(response); 
    } 

    var handleStateChange = function() { 
     switch (xmlhttp.readyState) { 
      case 0 : // UNINITIALIZED 
      case 1 : // LOADING 
      case 2 : // LOADED 
      case 3 : // INTERACTIVE 
       break; 
      case 4 : // COMPLETED 
       handleResponse(xmlhttp.status, xmlhttp.responseText); 
       break; 
      default: alert("error"); 
     } 
    } 

    var xmlhttp=new XMLHttpRequest(); 
    xmlhttp.onreadystatechange = handleStateChange; 
    xmlhttp.open("POST", "parserMain.php", true); 
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    xmlhttp.send("URL=" + document.getElementById("URL").value); 
} 
</script> 

私は私のPHPスクリプトの結果を得るために、このスクリプトを使用すると、asynchronusモード(真)で、私は、ステータス== 0を取得し、synchronusモード(偽)に私が手にしながら、私は空の応答を取得status == 200とし、結果を表示することができます。

いくつかのテストの後、私は、パーサーを使用して非同期リクエストが機能しなくなったことに気付きました。 PHPスクリプトがrunParserの前に停止している場合(たとえば存在しない変数の場合)、私は答えを得ることができます(この場合はREQ ERROR)。

私の問題はDOMDocument :: loadHTMLFileの使用に関連しているのですか、他の場所で問題がありますか?

答えて

0

リクエスト後にページの更新を無効にすることで問題を解決しました。 "return false;を追加する"onsubmit"属性で指定します。

<form method="POST" onsubmit="sendUrlToParser(); return false;"> 
関連する問題