バックグラウンド:
製品がチェックアウト チャートに追加される前に、カスタマイズ オプションを持つモーダル ウィンドウを起動する必要があります。このイベントの後でのみ、アイテムをチャートに追加する必要があります。他の言語 (c#) を使用すればこの機能を実現できますが、JQuery と JQuery UI についてもっと学びたいと思っています。
問題:
コンテナにデータを割り当てるためにさまざまな方法を試しましたが、これまでのところすべての方法が失敗しました。HTML 側のコードは約 2000 行あり、皆さんを退屈させたくないので、プログラムを少し単純化しました。元のソースから問題を短縮しようとしたため、余分なマークアップ タグや終了タグの欠落などのばかげた間違いは無視してください。
部分的な HTML:
<html>
<head></head>
<body>
<div class="ui-widget ui-helper-clearfix" style="height:100%; float:left !important; border:2px solid Black;">
<center>
<div class="optionsHeader" style="">RECOMMENDED VALUE PACKAGES</div></center><br />
<ul id="options" class="options ui-helper-reset ui-helper-clearfix">
<li class="ui-widget-content ui-corner-tr" id="100400" title="Please view product details for handle preferences before sellecting this option.">
<h5 class="ui-widget-header">Option 1</h5>
<font class="repairDetails" alt="Repair Details" style="">REHANDLE<br />FULL BLADE/TOE<br />REPAIR/REFURB</font>
<font style="color:Red; text-decoration:blink; font-size:0.7em; bottom:10;">Please view product details for <u>handle preferences</u> before sellecting this option.
</font><br />
<label class="price">£49.99</label>
<a class="ui-icon ui-icon-wrench dialog_but" title="View Product Detail" href="#" style="">View Product Detail</a>
<div class="dialog_content" title="" style="">
<div id="products">
<h1 class="ui-widget-header">Avaliable Bundle Options</h1>
<font>You can customise this option below</font>
<div id="pOptions">
<h2><a href="#">Handle</a></h2>
<div>
<ul>
</ul>
</div>
<h2><a href="#">Blade</a></h2>
<div>
<ul>
</ul>
</div>
<h2><a href="#">Grips</a></h2>
<div>
<ul>
</ul>
</div>
</div>
</div>
<div id="cart">
<h1 class="ui-widget-header">Sellected Options</h1>
<div class="ui-widget-content">
<ol>
<li class="placeholder"><i>Drag & Drop</i> your bat repair here</li>
</ol>
</div>
</div>
</div>
<a href="" title="Add to chart" class="ui-icon ui-icon-cart chart_but">Add to chart</a>
</li>
</ul>
</div>
<div id="chart" class="ui-widget-content ui-state-default">
<h4 class="ui-widget-header"><span class="ui-icon ui-icon-cart"></span>Repair Options You Have Chosen</h4>
</div>
</body>
</html>
部分的な JQuery:
$(function() {
// there's the options and the chart
var $options = $("#options"),
$chart = $("#chart");
//Add to chart
var recycle_icon = "<a href='' title='Remove this option' class='ui-icon ui-icon-arrowreturnthick-1-w'>Remove Option</a>";
function addToChart($item) {
// He is where i need to prompt the modal than continue as below;
$item.fadeOut(function() {
var $list = $("ul", $chart).length ? $("ul", $chart) : $("<ul class='options <ui-helper-> </ui-helper->reset'/>").appendTo($chart);
$item.find("a.ui-icon-cart").remove();
$item.append(recycle_icon).appendTo($list).fadeIn(function() {
$item.animate({
width: "100%px",
height: "100%px"
}) //Box
.find("font").animate({}); //Font
});
});
}
// revert frm chart function
var chart_icon = "<a href='' title='Add this option' class='ui-icon ui-icon-cart'>Add Option</a>";
function revertFrmChart($item) {
$item.fadeOut(function() {
$item.find("a.ui-icon-arrowreturnthick-1-w").remove().end().css("width", "100%px").append(chart_icon).find("font").css("height", "100%px").end().appendTo($options).fadeIn();
});
}
// resolve the icons behavior with event delegation
$("ul.options > li").click(function(event) {
var $item = $(this),
$target = $(event.target);
if ($target.is("a.ui-icon-cart")) {
addToChart($item);
} else if ($target.is("a.ui-icon-arrowreturnthick-1-w")) {
revertFrmChart($item);
}
return false;
});
});
//do when the dom is ready
jQuery(document).ready(function($) {
//loop through every button anchor element
$('.dialog_but').each(function() {
//create a local scope of a dialog variable to attach
var $dialog;
//create the dialog for the div.dialog_content standing next to the anchor element
//I set the autoOpen false so that it can be reusable later
//also I set the modal = true to appear the dialog as a modal prompt
$dialog = $(this).next('div.dialog_content').dialog({
title: 'Product Detail',
modal: true,
autoOpen: false,
width: 600,
show: 'fade',
hide: 'fade'
});
//Swapped this with the inline version
//add a wee bit of button thing
// $(this).button({
// icons: {
// primary: 'ui-icon-info'
// }
// });
//now attach the open event of the dialog to the anchor element
$(this).click(function(e) {
//prevent the anchor element to go to the hyperlinked page
e.preventDefault();
//open the dialog
$dialog.dialog('open');
}); //done
});
});
//Modal window to ask and submit additional user details
$(function() {
var hShape = $("#hShape"),
hSize = $("#hSize"),
hType = $("#hType"),
allFields = $([]).add(hShape).add(hSize).add(hType),
tips = $(".validateTips");
$("#dialog-form").dialog({
autoOpen: false,
height: 400,
width: 400,
modal: true,
show: 'fade',
hide: 'fade',
buttons: {
"Add Details": function() {
var bValid = true;
allFields.removeClass("ui-state-error");
bValid = bValid && checkLength(hShape, "Handle Shape", 3);
bValid = bValid && checkLength(hSize, "Handle Size", 1);
bValid = bValid && checkLength(hType, "Handle Type", 3);
// find relevant parent element
var $el = $(this).closest('.ui-dialog');
if (bValid) {
// set the context to the visible div in the background -
$('#addHere', $el.prevAll('.ui-dialog:visible')).append("<tr>" + "<td>" + hShape.val() + "</td>" + "<td>" + hSize.val() + "</td>" + "<td>" + hType.val() + "</td>" + "</tr>")
}
$(this).dialog("close");
},
Cancel: function() {
$(this).dialog("close");
}
},
close: function() {
allFields.val("").removeClass("ui-state-error");
}
});
$("#handle-pre").live("click", function() {
$("#dialog-form").dialog("open");
});
});
JSFiddle :
レンチ アイコンをクリックすると、モーダルが表示されます。これは、ユーザーがグラフに追加をクリックしたときに起動する必要があるモーダルです。