我一直在寻找这个问题的答案,但是我还是没有找到。
我有一个有四个Select的表单,只有第一个Select是必需的。这些选择有一个JS脚本填充的选项从我的数据库拉,使一个动态依赖的下拉菜单。问题是我不希望"未选择"选择传递他们的参数到URL,使查询字符串长而复杂。另外,当"未选中"选择传递默认值时,它类似于"选择组",在URL中显示为"选择+组"。我绝对想使用GET,所以我可以复制/保存链接。我怎样才能有条件地添加选择值,而不是阻止JS脚本填充选项?
例如,下面是一个典型的URL:
mydomain.com/bn/products?Division=1&Group=Select+Group&Segment=Select+Segment&Category=Select+Category
这是我想要的URL,用于我的。htaccess &RewriteRule:
mydomain.com/bn/products/1
因为没有选择Group, Segment和Category,它们的值对会造成不必要的URL混乱。
如有任何建议,不胜感激。
更多信息
我是第一次在这里发帖,我不知道在哪里添加冗长的后续文章。是:
我喜欢拦截和通过JS生成一个基于选择的新URL的想法。我遇到的一个问题是URL是由表单创建的:
mydomain.com/bn/products?Division=1
一点背景知识可能会有帮助。我使用内容变量从数据库检索页面内容。网站首页以外的所有内容都显示在内容目录(/bn)中。在上面的链接中发生的事情是,内容变量已经设置好了(产品),但是表单是放置的?在内容变量之后。下面是一个简单的rewriterrule,如果URL写对了,它就可以工作了:
RewriteRule ^bn/products/([0-9-]+)$ /bn/index.php?content=products&Division=$1
我可以使用以下URL访问我的选择:mydomain.com/bn/products/1
,因为它符合重写规则。同样,我可以使用传统的:mydomain.com/bn/index.php?content=products&Division=$1
到达那里。
现在我必须承认,我是一个PHP的家伙,非常有限的JS和jQuery经验。Shomz建议在my_submit_function中使用onsubmit="my_submit_function(); return false;"
,我可以检查选择var divValue = $('#Division').val()
的值并将其附加到URL。我不知道的是如何发送生成的URL。显然,我希望URL是在"友好"的形式mydomain.com/bn/products/1
。有人能提供一些见解吗?
我已经创建了一个函数,用我的JS条件生成的URL替换表单创建的URL。首先,这是表单top:
<form action="" onsubmit="my_submit_function()" method="get" name="DDm" id="DDm">
然后我的一个选择:
<select id="Division" name="Division" onchange="Division_reload(this)">
<option selected><?php echo $division; ?></option>
</select>
动态下拉菜单脚本添加了onchange元素,这会导致我的问题吗?
我的函数:
function my_submit_function() {
var DDmURL = $reqURL;
var divVal = document.getElementById('Division').value;
var grpVal = document.getElementById('Group').value;
var segVal = document.getElementById('Segment').value;
var catVal = document.getElementById('Category').value;
if ((divVal != $division) || (divVal != -1)) {
DDmURL += '/'+divVal; }
if ((grpVal != $group) || (grpVal != -1)) {
DDmURL += '/'+grpVal; }
if ((segVal != $segment) || (segVal != -1)) {
DDmURL += '/'+segVal; }
if ((catVal != $category) || (catVal != -1)) {
DDmURL += '/'+catVal; }
window.location = DDmURL;
};
我应该提到PHP变量($division等)是默认值,如"Selectdivision"。我还应该提到,为了简化上面的JS代码,我省略了显示php的打开和关闭标记。标签在那里,只是没有显示。
当我使用下拉菜单从Division中选择时,我仍然得到与以前相同的URL:
mydomain.com/bn/products?Division=1
有任何想法为什么这不是预期的工作?
正如我在给Shomz的评论中所说的,我没有把PHP变量用引号括起来,这导致了问题,并导致控制台上出现错误消息。一旦我改变了,一切都像预期的那样。
感谢大家的帮助。
要删除那些"选择+组"从显示,只需分配这些选项的值为零或任何适合你。(但在完成以下段落后,您甚至不需要它)
为了完全阻止这些发送,你可以创建一个onsubmit
函数,它将覆盖表单提交功能,并首先基于所选的选项生成一个新的URL,然后才会重定向。还可以从DOM中完全删除未选中的元素,然后提交表单。无论您选择哪一个,HTML部分应该看起来像这样:<form method="GET" action="your_url" onsubmit="my_submit_function(); return false;">
基于你提供的额外信息,我可以说你可以建立你想要的友好的url,你不受任何方式的限制。您可以像在PHP中一样使用if
或switch
语句。例如:
var url = siteRoot;
if (divValue == "someUglyProductsValue")
url += '/products';
else if (divValue == "someUglyOtherValue")
url += '/other';
if (groupValue == "someUglyWhateverValue")
url += '/whatever';
等等……这将能够为您提供mydomain.com/bn/products/whatever
或mydomain.com/bn/other
或mydomain.com/bn/other/whatever
…
按照您想要的方式构建整个URL之后,您可以做一些像window.location = url;
这样简单的事情来重定向您的浏览器。
如果你能分享一些你的代码会更容易。
我的想法是在改变表单的同时动态生成目标url。因此,如果您不需要的选择之一被取消选择,它们的url部分也被删除。
然后,在目标PHP页面上,使用isset($_GET['something'])检查这些元素是否被检查。