PHP区分javascript和用户点击?

rlb*_*usa 10 javascript forms post

我正在将JavaScript注入PHP网站以避免弹出窗口,以自动提交表单。另外,jquery存在问题,因此我使用的是纯JavaScript。

这是页面上的表格:

<form action='http://mywebsite.com/index.php?&act=MYFUNCTION&CODE=01&CookieDate=1' name='subscribe_check' method='POST'>
<input type='hidden' name='value1' value='dynamicallygenerated'>
<input type='hidden' name='Value2' value='BlogSection'>
<input type='hidden' name='Value3' value='BlogName'>
<select class='forminput' name='sub_id' onchange='this.form.submit()'>
<option value='------------' selected='selected'>To read this article, you must choose a subscription level</option>
<option value='1'>Subscribe to daily updates</option>
<option value='2'>Subscribe to promotional emails</option>
<option value='3'>No thanks, I'm not interested in being healthy</option>
</select>
</form>
Run Code Online (Sandbox Code Playgroud)

这是我的javascript:

  // unselect any selected item on the SELECT
  if( document.getElementsByName('subscribe_check').selectedIndex )
    document.getElementsByName('subscribe_check')[document.getElementsByName('subscribe_check').selectedIndex].selected = false;

  // select select the last option
  document.getElementsByName('subscribe_check')[1][3].selected = true;
  // submit the form
  document.forms[0].submit();
Run Code Online (Sandbox Code Playgroud)

当我手动单击表单时,我知道这些值已设置

  value1: dynamicallygenerated
  value2: HealthyFoodSection
  value3: HealthyFoodFunBlog
Run Code Online (Sandbox Code Playgroud)

但是,当我的JavaScript提交表单时,这些值就会提交

  value1: dynamicallygenerated
  value2: BlogSection
  value3: BlogName
Run Code Online (Sandbox Code Playgroud)

我100%确定没有其他JavaScript可以触发更改值-不能直接onchange调用submit()

我不明白为什么我的javascript提交表单没有像手动单击那样更改值?如果发生PHP,我什至不知道该如何检测我的javascript提交了表单而不是单击提交,提交单击就是提交单击,对吗?

Lui*_*mas 6

首先,这个问题仅涉及JS,不涉及PHP,

关于您的原始问题,JS提交和用户单击之间没有区别,真正的区别只是触发提交事件的事件(事件clickchangeevt.targetDOM触发事件)。

建议使用addEventListener而不是直接使用onchange属性来绑定事件,它看起来像这样:

document.getElementsByName('sub_id')[0].addEventListener("onchange", function(evt) {
    document.forms[0].submit();
});
Run Code Online (Sandbox Code Playgroud)

请尝试以下解决方案:

1.修正输入名称:

由此:

<input type='hidden' name='Value2' value='BlogSection'>
<input type='hidden' name='Value3' value='BlogName'>
Run Code Online (Sandbox Code Playgroud)

为此,根据您的问题,它们都应为小写:

<input type='hidden' name='value2' value='BlogSection'>
<input type='hidden' name='value3' value='BlogName'>
Run Code Online (Sandbox Code Playgroud)

2.修复您的JS onclick实现:

由此:

  // unselect any selected item on the SELECT
  if( document.getElementsByName('subscribe_check').selectedIndex )
    document.getElementsByName('subscribe_check')[document.getElementsByName('subscribe_check').selectedIndex].selected = false;
  // select select the last option
  document.getElementsByName('subscribe_check')[1][3].selected = true;
Run Code Online (Sandbox Code Playgroud)

为此,根据您的问题,他们应该指向sub_id,还要注意最后一行的索引(idx [1][3]不存在,应该是[0][3]):

  // unselect any selected item on the SELECT
  if( document.getElementsByName('sub_id').selectedIndex )
    document.getElementsByName('sub_id')[document.getElementsByName('sub_id').selectedIndex].selected = false;
  // select select the last option
  document.getElementsByName('sub_id')[0][3].selected = true;
Run Code Online (Sandbox Code Playgroud)

3.执行相同的提交功能

从中更改HTML:

<select class='forminput' name='sub_id' onchange='this.form.submit()'>
Run Code Online (Sandbox Code Playgroud)

对此:

<select class='forminput' name='sub_id' onchange='document.forms[0].submit()'>
Run Code Online (Sandbox Code Playgroud)

也...

只是为了确保没有其他修改输入值的操作,所以在触发onchange之后立即打印它们,就像这样...并且还延迟了提交并再次打印它们,这应该使正在发生的事情看起来很漂亮:

document.getElementsByName('sub_id')[0].addEventListener("onchange", function(evt) {
    console.log(document.getElementsByName('value2'), document.getElementsByName('value3'));
    setTimeout(function() {
         console.log(document.getElementsByName('value2'), document.getElementsByName('value3'))
         document.forms[0].submit();
    },100);
});
Run Code Online (Sandbox Code Playgroud)