简体   繁体   English

是否可以从Ajax响应更改Javascript变量?

[英]Is it possible to change a Javascript Variable from an Ajax Response?

I'm trying to update a Javascript variable that controls a scrolling script based upon some Ajax code. 我正在尝试更新一个Javascript变量,该变量基于一些Ajax代码来控制滚动脚本。 The Ajax code is supposed to add to the JS Var when conditions are true in the Ajax script. 当Ajax脚本中的条件为true时,应该将Ajax代码添加到JS Var中。 Is there any way to trigger this? 有什么办法可以触发这个吗?

Thanks! 谢谢!

edit : I'm not sure how to change the value of the variable. 编辑 :我不确定如何更改变量的值。 I've tried changing it via the Ajax but it doesn't get parsed. 我已经尝试通过Ajax对其进行更改,但无法解析。 I've also tried using PHP inside of JS to check a condition, but doing that only works once. 我也尝试过在JS内使用PHP来检查条件,但这样做只能起作用一次。

JS Code JS代码

function speedUp()
    {
    actualheight = actualheight + 50;
    }

function slowDown()
{
actualheight = actualheight - 50;
}

function ajaxFunction()
{
var xmlhttp = createRequestObject();
xmlhttp.onreadystatechange=function()
{
if(xmlhttp.readyState==4)
  {
   document.getElementById('iemarquee').innerHTML=xmlhttp.responseText;
   document.getElementById('iemarquee2').innerHTML=xmlhttp.responseText;
  }
}
xmlhttp.open("GET","saleCallTest.php",true);
xmlhttp.send(null);
}

/*
Cross browser Marquee II- © Dynamic Drive (www.dynamicdrive.com)
For full source code, 100's more DHTML scripts, and TOS, visit http://www.dynamicdrive.com
Modified by jscheuer1 for continuous content. Credit MUST stay intact for use
*/

//Specify the marquee's width (in pixels)
var marqueewidth="500px"
//Specify the marquee's height
var marqueeheight="500px"
//Specify the marquee's marquee speed (larger is faster 1-10)
var marqueespeed=1
//Specify initial pause before scrolling in milliseconds
var initPause=1000
//Specify start with Full(1)or Empty(0) Marquee
var full=1
//Pause marquee onMousever (0=no. 1=yes)?
var pauseit=0
//Specify Break characters for IE as the two iterations
//of the marquee, if text, will be too close together in IE
var iebreak='<p></p>'

//Specify the marquee's content
//Keep all content on ONE line, and backslash any single quotations (ie: that\'s great):

var marqueecontent='<?php for($i=0;$i<=count($saleItems);$i++)
{
if ($saleItems[$i]['stateOfItem'] =="Sold" || $saleItems[$i]['stateOfItem'] =="Unsold")
{
$_SESSION['countItems']++;

echo $saleItems[$i]['itemNumber'];
echo $saleItems[$i]['stateOfItem'] . '<br />';

}};
?>'


////NO NEED TO EDIT BELOW THIS LINE////////////
var copyspeed=marqueespeed
var pausespeed=(pauseit==0)? copyspeed: 0
var iedom=document.all||document.getElementById
var actualheight=''
var cross_marquee, cross_marquee2, ns_marquee

function populate(){
if (iedom){
var lb=document.getElementById&&!document.all? '' : iebreak
cross_marquee=document.getElementById? document.getElementById("iemarquee") : document.all.iemarquee
cross_marquee2=document.getElementById? document.getElementById("iemarquee2") : document.all.iemarquee2
cross_marquee.style.top=(full==1)? '8px' : parseInt(marqueeheight)+8+"px"
cross_marquee2.innerHTML=cross_marquee.innerHTML=marqueecontent+lb
actualheight=cross_marquee.offsetHeight
cross_marquee2.style.top=(parseInt(cross_marquee.style.top)+actualheight+8)+"px" //indicates following #1

}
else if (document.layers){
ns_marquee=document.ns_marquee.document.ns_marquee2
ns_marquee.top=parseInt(marqueeheight)+8
ns_marquee.document.write(marqueecontent)
ns_marquee.document.close()
actualheight=ns_marquee.document.height

}
setTimeout('lefttime=setInterval("scrollmarquee()",20)',initPause)
}
window.onload=populate

function scrollmarquee(){

if (iedom){
if (parseInt(cross_marquee.style.top)<(actualheight*(-1)+8))
cross_marquee.style.top=(parseInt(cross_marquee2.style.top)+actualheight+8)+"px"
if (parseInt(cross_marquee2.style.top)<(actualheight*(-1)+8))
cross_marquee2.style.top=(parseInt(cross_marquee.style.top)+actualheight+8)+"px"
cross_marquee2.style.top=parseInt(cross_marquee2.style.top)-copyspeed+"px"
cross_marquee.style.top=parseInt(cross_marquee.style.top)-copyspeed+"px"
}

else if (document.layers){
if (ns_marquee.top>(actualheight*(-1)+8))
ns_marquee.top-=copyspeed
else
ns_marquee.top=parseInt(marqueeheight)+8
}
}

if (iedom||document.layers){
with (document){
if (iedom){
write('<div style="position:relative;width:'+marqueewidth+';height:'+marqueeheight+';overflow:hidden" onMouseover="copyspeed=pausespeed" onMouseout="copyspeed=marqueespeed">')
write('<div id="iemarquee" style="position:absolute;left:0px;top:0px;width:100%;background:black;color:white;font-size:30pt;">')
write('</div><div id="iemarquee2" style="position:absolute;left:0px;top:0px;width:100%;z-index:100;background:black;color:white;font-size:30pt;">')
write('</div></div>')

}
else if (document.layers){
write('<ilayer width='+marqueewidth+' height='+marqueeheight+' name="ns_marquee">')
write('<layer name="ns_marquee2" width='+marqueewidth+' height='+marqueeheight+' left=0 top=0 onMouseover="copyspeed=pausespeed" onMouseout="copyspeed=marqueespeed"></layer>')
write('</ilayer>')
}
}
}


</script>

AJAX->PHP CODE AJAX-> PHP代码

<?php
session_start();

//NuSoap Library
require_once('./lib/nusoap.php');
$_SESSION['countTotal'] = 0;

//Creating a Client
$client = new nusoap_client('http://xx.xx.x.xxx:xxxx/WSSERVICE/services/SERVICE?WSDL');



$saleItems= $client->call("getItems", array("Sale" => '001'));

$_SESSION['countNew'] = 0;


$countPresale = count($saleItems);
$timer = $countPresale * 3.15;

 for($i=0;$i<=count($saleItems);$i++)
{
if ($saleItems[$i]['stateOfItem'] =="Sold" || $saleItems[$i]['stateOfItem'] =="Unsold")
{
$_SESSION['countNew']++;

echo $saleItems[$i]['itemNumber'];
echo $saleItems[$i]['stateOfItem'] . '<br />';

}};

if($_SESSION['countNew'] < $_SESSION['countVehicles'])
{
$_SESSION['countTotal']--;
}

if($_SESSION['countNew'] > $_SESSION['countVehicles'])
{
$_SESSION['countTotal']++;
}


if($_SESSION['countTotal'] < 0)
{
$opx = 3 * ($_SESSION['countItems'] - $_SESSION['countNew']);
echo 'actualheight = parseInt(actualheight) + parseInt(' . $opx . ');';
$_SESSION['countVehicles'] = $_SESSION['countNew'];

}

if($_SESSION['countTotal'] > 0)
{
$opx = 3 * ($_SESSION['countItems'] + ($_SESSION['countNew'] - $_SESSION['countNew']));
echo 'actualheight = parseInt(actualheight) - parseInt(' . $opx . ');';
$_SESSION['countItems'] = $_SESSION['countNew'];

}



?>

Assuming that the variable is not locked away in a different namespace with no interface made available, then of course. 当然,假设没有将变量锁定在没有接口可用的其他命名空间中,那么当然。

"Ajax" just means "Fetch some data from the server using JS without leaving the page, then run some JS". “ Ajax”仅表示“使用JS在不离开页面的情况下从服务器获取一些数据,然后运行一些JS”。

There is nothing special that adds extra limitations to what that JS can do. 没有什么特别的可以增加JS可以做的额外限制。

I ran into some issues with this as well. 我也遇到了一些问题。 Probably namespace problems like another answer here suggests. 可能是名称空间问题,如此处的另一个答案所示。
Rather than figure out the what/when/why, I just used <input name="blah" type=hidden> and then update that and read that with Javascript: 我没有弄清楚什么/什么时候/为什么,而是使用了<input name="blah" type=hidden> ,然后对其进行更新并使用Javascript进行读取:

Then, to write the variable: document.getElementById('blah').value='some new value'; 然后,编写变量: document.getElementById('blah').value='some new value';

To read the variable: somevar=document.getElementById('blah').value; 读取变量: somevar=document.getElementById('blah').value;

That has worked every time. 每次都奏效。 Actually figuring out the correct namespace would be a better option, but this works. 实际上,找出正确的名称空间将是一个更好的选择,但这是可行的。

EDIT: Are you using any Javascript libraries to do your ajax for you, or just coding it from scratch? 编辑:您是否正在使用任何Javascript库为您做ajax,还是只是从头开始对其进行编码? I've used xajax, Prototype, and Jquery for things like this. 我已经使用xajax,Prototype和Jquery来进行此类操作。 Jquery is my new baby, but 5 years ago already this was dead simple in xajax. jQuery是我的新宝贝,但是5年前,这在xajax中已经非常简单了。

I'm not sure I want to steer you down that path but for a php programmer, xajax is a pretty simple method to learn. 我不确定我是否想引导您走这条路,但是对于PHP程序员而言,xajax是一种非常简单的学习方法。 Jquery is more powerful and extensible though in my opinion. 尽管我认为Jquery更加强大和可扩展。

EDIT2: Far as I can tell you are returning both HTML and javascript to be executed in the same response. EDIT2:据我所知,您将返回HTML和javascript并在同一响应中执行。 Including a javascript in your response doesn't make it get executed. 在响应中包含javascript不会使其得到执行。 Perhaps you should be serializing your return with JSON so you can eval your javascript to be executed, and assign your innerHTML separately. 也许您应该使用JSON序列化返回的内容,以便评估要执行的JavaScript,并分别分配您的innerHTML。 Just for reference, the same thing you could do in xajax with just: 仅供参考,您可以在xajax中执行以下操作:

$objResponse->addAssign("idhere","innerHTML", "some html");
$objResponse->addScript("somvar = somevar + someothervar");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM