我有一个循环,为集合中的每个元素生成标签。标签生成正确,标签上的内容正确生成。每个选项卡都有一个DropDownList控件,其中包含一个项目列表。除了一件事,一切似乎都正常。第一个选项卡上的控件的javascript click事件触发,但click事件不会触发所有其他选项卡?
我认为每个标签都有自己的事件处理程序,因此代码是循环的一部分。然而,控件的“名称/ ID”在每个选项卡上都是相同的,我想知道这是否是我的问题。
每个标签具有相同的“命名”控件是否存在某种困难/问题?我想......也许是错误的...每个标签都有自己的背景,因此不存在任何问题。
循环代码:
foreach (var extbrd in Model.ExtBds)
{
tabstrip.Add()
.Text(extbrd.ExtName)
.ImageUrl("~/.../TabIcon.png")
.Content(@<text>
<div>
@Html.Action("Controller", "Action", new { object })
</div>
</text>);
}
正如您在循环中看到的那样,标签代码是局部视图。我已经删除了很多额外的代码,但如果需要可以发布/编辑它。该代码是:
....snip
<script type="text/javascript">
$(function() {
$("#@Html.FieldIdFor(model => model.ExtFIds)").click(function ()
{...this code works fine so dropped it....});
});
</script>
....more snipping....
<tr>
<td style="width:400px;">
@Html.DropDownListFor(model => model.ExtFIds, Model.SelectThreads, new {style = "width:400px;height:400px", @size = 30})
</td>
所以你看到代码使用相同的名称作为控件,因此使用javascript .click事件处理程序。
此外,我认为知道我正在使用Telerik mvc选项卡控件对象会很有帮助。
使用F12调试器我在控制台中看不到任何错误或类似......在我看来,点击事件只是没有在标签2上触发......?
非常感谢任何想法。
谢谢
根据建议编辑1我这样做是为了添加一个类:
<td>
@Html.DropDownListFor(model => model.ExtFIds, Model.SelectThreads, new {style = "width:400px;height:400px", @size = 30, @Class = "ddlTab_" + Model.ExtFIds.ToString() } )
</td>
和javascript:
$(".ddlTab_@(Model.ExtFIds)").click(function ()
这导致每个ddl都具有唯一的类名和唯一的事件处理程序,但第一个选项卡仍然只能工作???
编辑2
我稍微修改了对此的建议答案:
<div class="Tab">
@Html.Action("Controller", "Action", new { object })
</div>
和javascrip到此:
$("div.Tab").click(function ()
{
alert(this.id);
结果是当我点击ddl时我确实得到了弹出警告...这是有道理的,因为它在div中有一个处理程序,但警报是空的。我也有两个警报,所以即使我只点击了ddl中的一个项目,它也会点击两次点击事件?
EDIT3
我没有包装作为局部视图循环的外部div,而是更改了div来包装刚刚创建的ddl并添加了一个如下所示的id:
<div class="Tab" id="ddlTab_@(Model.ExtFIds.ToString())">
@Html.DropDownListFor(model => model.ExtFIds, Model.SelectThreads, new {style = "width:400px;height:400px", @size = 30} )
</div>
我的提醒现在会生成点击的div的名称。仍然开火两次,但我现在可以忍受。
所以现在它正在解雇我想我要做的是深入到div的子对象,这将是ddl ...获取所选项目并从那里继续正常进行。
最终编辑 - 已解决
所以我通过使用缠绕在ddl上的div来使用它,但在我看来这肯定是一个创可贴/解决方法......也许不是。我只是不知道该怎么说。对于其他任何人来说,这就是我最终要做的事情。
在razor cshtml中,我将ddl包装在div中,如上面编辑3中所述,并确保它具有唯一ID(由我的模型ExtFIds提供的唯一性)。
<div class="Tab" id="ddlTab_@(Model.ExtFIds.ToString())">
@Html.DropDownListFor(model => model.ExtFIds, Model.ST, new {style = "...", @size = 30, @Class = "ddlTab_" + Model.ExtFIds.ToString() } )
在脚本部分:
$(function(){ $(“div.Tab”)。click(function()//所以我将事件处理程序附加到div而不是ddl { var id = this.id var idLen = id.length;
id = id.substr(7, idLen);
//get the div id and then trim off the leading string
//get our raw html string and load it into an object
var rawModel = $('#HiddenModel_' + id).html();
//here I access a control on the tab using the id obtained above...
//of course in the cshtm I concat the model id to the name as seen for the div
var jsonModel = jQuery.parseJSON(rawModel) //turn the data into json object
var selectedItem = $('.ddlTab_' + id).val();
//here I have to drill down to the correct ddl to find the selected item
//again the model id provides unique name
var matchingObj = getObjects(jsonModel, 'ThreadValue', selectedItem);
//search through my json object to find matching item.
if(matchingObj.length > 0)
{
//update two controls with matched value
//at this point I think you get the idea...the model id makes for
//unique names that can be drilled down to from the wrapping div
var $FrmDiv = $('#ForumFrame_' + id);
if ($FrmDiv.length)
{
$FrmDiv.empty();
$FrmDiv.append(matchingObj[0].Link);
}
var $prevfram = $('#ForumPreview_' + id);
if ( $prevfram.length ) {
$prevfram.val(matchingObj[0].Description);
}
}
});
});
我欢迎对此帖的任何改进/建议/解释。
答案 0 :(得分:0)
这样做,向标签添加一个类:
foreach (var extbrd in Model.ExtBds)
{
tabstrip.Add()
.Text(extbrd.ExtName)
.ImageUrl("~/.../TabIcon.png")
.Content(@<text>
<div class="tab">
@Html.Action("Controller", "Action", new { object })
</div>
</text>);
}
并在这样的javascript中执行:
<script type="text/javascript">
$(function() {
$("div.tab)").click(function () {
var id = this.id;
// do whatever here you want to do
});
});
</script>