在没有页面刷新的情况下将变量从JavaScript传递到PHP

时间:2014-07-23 22:04:19

标签: javascript php html xpath domdocument

我正在编写一些在JavaScript中具有变量的代码,必须将其传递到同一文档中的PHP脚本中。用户输入将用于从某个外部站点中删除。

JavaScript变量为HtmlLink,需要将其传递给PHP代码,其中显示INSERT HTMLLINK VARIABLE HERE而不重新加载页面。

<!DOCTYPE HTML>
<HEAD>
   <TITLE>Test Input</TITLE>
   <SCRIPT>
      type = "text/javascript"
      function testResults (form) {
         var TestVar = form.inputbox.value + ".html";
         var HtmlLink = "www.mp3skull.com/mp3/" + TestVar;
         document.write(HtmlLink);
      }
   </SCRIPT>
   <?php
      $contents = file_get_contents('INSERT HTMLLINK VARIABLE HERE');
      $dom = new DOMDocument();
      libxml_use_internal_errors(true);
      $dom->loadHTML($contents);
      libxml_clear_errors();
      $xpath = new DOMXpath($dom);

      $element = $xpath->query('//div[@id="right_song"]/div[3]/div[1]/div[1]/a')->item(0)-                    
      echo $element;  
   ?>  
</HEAD>
<BODY>
   <FORM NAME="myform" ACTION="" METHOD="GET"> Song Name <BR>
      <INPUT TYPE="text" NAME="inputbox" VALUE=""><P>
      <INPUT TYPE="button" NAME="button" Value="Search" onClick="testResults(this.form)">
   </FORM>
</BODY>
</HTML>

2 个答案:

答案 0 :(得分:1)

如果你想进行一些搜索,首先当然要先构建正确的URL,然后从那里搜索/搜索网站,实际上基本代码已经在工作,所以是时候构建它了。你可以这样做:Sample Demo

$main_url = 'http://www.mp3skull.com/mp3/';
$results = array();

if(isset($_POST['submit'])) {
    // handle input (sample: hot mallets)
    $input = preg_replace('/[\s]+/', '_', strtolower(trim($_POST['input'])));
    $main_url .= $input . '.html'; // turns to hot_mallets.html

    $contents = @file_get_contents($main_url);
    if($contents !== false) { // simple error checking

        $dom = new DOMDocument();
        libxml_use_internal_errors(true);
        $dom->loadHTML($contents);
        libxml_clear_errors();
        $xpath = new DOMXpath($dom);

        $search_results = $xpath->query('//div[@id="song_html"]');
        if($search_results->length > 0) {
            foreach($search_results as $result) {
                // each row result, put it inside the array
                $results[] = $xpath->query('//div[@id="right_song"]/div[3]/div[1]/div[1]/a', $result)->item(0)->getAttribute('href');
            }
        } else {
            echo 'Zero results';
        }


    } else {
        echo 'Some error on getting results from external site.';
        exit;
    }
}

?>

<form method="POST">
    <label for="inputbox">Song Name: <input type="text" id="inputbox" name="input"/ ></label>
    <input type="submit" name="submit" />
</form>
<?php if(!empty($results)): ?>
<h3>Search Results:</h3>
<ul>
    <?php foreach($results as $result): ?>
        <li><?php echo $result; ?></li>
    <?php endforeach; ?>
</ul>
<?php endif; ?>

答案 1 :(得分:0)

由于页面在网络上的加载方式,这在大多数设置中都没有用。 PHP在服务器上运行,将javascript和HTML发送到客户端,然后在客户端上执行javascript。在这个过程中,javascript在php中设置变量为时已晚,因为php已经完成加载。您可以使用ajax从javascript发送请求。如果您这样做,页面将加载如下:

(服务器向客户端提供初始HTML / javascript / CSS) - &gt;(客户端运行javascript,向服务器发出请求(在用户输入数据后)) - &gt;(外部请求的结果返回并且现在可用通过javascript)。

您并不是真的需要为您尝试做的事情做到这一点 - 从另一个页面获取链接。你应该做的是在php中编写你的javascript东西,然后回显链接。然后,将表单设置为提交回同一页面。这是一个例子:

<!doctype html>
<head>
    <title>Fetch Link</title>
</head>
    <body>
        <?php
            ini_set('display_errors', 0);
            if (isset ($_GET['search_term']))
            {
                $searchTerm = $_GET['search_term'];
                $searchPage = "http://www.example.com/".$searchTerm.'.html';
                $searchPageContents = file_get_contents($searchPage);
                $feedBack = '';
                $failedMessage = 'Sorry, we couldn\'t match your search =(';

                if ($searchPageContents !== FALSE)
                {
                    $searchPageDom = new DOMDocument();

                    if (!$searchPageDom->loadHTML($searchPageContents))
                        $feedBack = $failedMessage;
                    else
                    {
                        $searchPageXpathWrapper = new DOMXpath($searchPageDom);
                        $searchLinkNode = $searchPageXpathWrapper
                        ->query('SOME QUERY HERE')
                        ->item(0);

                        $searchLink = $searchPageDom->saveHTML ($searchLinkNode);
                        $feedBack = $searchLink;
                    }
                }
                else
                    $feedBack = $failedMessage;

            }
            else
                $feedBack = 'Please enter a search term';

            echo $feedBack.'<br>';
        ?>
        <form name="myform" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>" method="GET">
            <label for='search_name' for='search_term'>Search Term</label>
            <input type="text" name="search_term">
            <input type='submit' value='Search'>
        </form>
    </body>
</html>

当然,除非你有一个特别好的理由从页面获取链接而不是自己生成链接 - 你可以用最少的javascript自己生成链接并保存到服务器的往返并防止页面格式在另一侧发生变化的可能性。