jQWidgets Forums
jQuery UI Widgets › Forums › Navigation › Menu, Context Menu › Menu served from Ajax callback
Tagged: jquery menu component
This topic contains 1 reply, has 2 voices, and was last updated by Peter Stoev 10 years, 9 months ago.
-
Author
-
Hi
I my app the menu items for the grid context menu are retrieved from the backend via an ajax call. However, the items are not rendered correctly and they are not clickable. I am able to reproduce the problem by modifying the sample page contextmenu.htm slightly. In the sample I don’t even use the data from the ajax call.
Any advise is greatly appreciated!Thanks
<!DOCTYPE html> <html lang="en"> <head> <title id='Description'>Right-Click on a jqxGrid Row to open a Context Menu.</title> <link rel="stylesheet" href="../../jqwidgets/styles/jqx.base.css" type="text/css" /> <script type="text/javascript" src="../../scripts/jquery-1.10.2.min.js"></script> <script type="text/javascript" src="../../jqwidgets/jqxcore.js"></script> <script type="text/javascript" src="../../jqwidgets/jqxdata.js"></script> <script type="text/javascript" src="../../jqwidgets/jqxbuttons.js"></script> <script type="text/javascript" src="../../jqwidgets/jqxscrollbar.js"></script> <script type="text/javascript" src="../../jqwidgets/jqxmenu.js"></script> <script type="text/javascript" src="../../jqwidgets/jqxgrid.js"></script> <script type="text/javascript" src="../../jqwidgets/jqxgrid.pager.js"></script> <script type="text/javascript" src="../../jqwidgets/jqxgrid.selection.js"></script> <script type="text/javascript" src="../../jqwidgets/jqxnumberinput.js"></script> <script type="text/javascript" src="../../jqwidgets/jqxwindow.js"></script> <script type="text/javascript" src="../../jqwidgets/jqxlistbox.js"></script> <script type="text/javascript" src="../../jqwidgets/jqxdropdownlist.js"></script> <script type="text/javascript" src="../../scripts/gettheme.js"></script> <script type="text/javascript" src="generatedata.js"></script> <script type="text/javascript"> $(document).ready(function () { var theme = ""; // prepare the data var data = generatedata(25); var source = { localdata: data, datatype: "array", datafields: [ { name: 'firstname', type: 'string' }, { name: 'lastname', type: 'string' }, { name: 'productname', type: 'string' }, { name: 'quantity', type: 'number' }, { name: 'price', type: 'number' } ], updaterow: function (rowid, rowdata, commit) { // synchronize with the server - send update command // call commit with parameter true if the synchronization with the server is successful // and with parameter false if the synchronization failed. commit(true); }, deleterow: function (rowid, commit) { // synchronize with the server - send delete command // call commit with parameter true if the synchronization with the server is successful // and with parameter false if the synchronization failed. commit(true); } }; // initialize the input fields. $("#firstName").addClass('jqx-input'); $("#lastName").addClass('jqx-input'); $("#product").addClass('jqx-input'); $("#firstName").width(150); $("#firstName").height(23); $("#lastName").width(150); $("#lastName").height(23); $("#product").width(150); $("#product").height(23); if (theme.length > 0) { $("#firstName").addClass('jqx-input-' + theme); $("#lastName").addClass('jqx-input-' + theme); $("#product").addClass('jqx-input-' + theme); } $("#quantity").jqxNumberInput({ width: 150, height: 23, theme: theme, decimalDigits: 0, spinButtons: true }); $("#price").jqxNumberInput({symbol: '$', width: 150, height: 23, theme: theme, spinButtons: true }); var dataAdapter = new $.jqx.dataAdapter(source); var editrow = -1; // initialize jqxGrid $("#jqxgrid").jqxGrid( { width: 670, source: dataAdapter, theme: theme, pageable: true, autoheight: true, columns: [ { text: 'First Name', datafield: 'firstname', width: 100 }, { text: 'Last Name', datafield: 'lastname', width: 100 }, { text: 'Product', datafield: 'productname', width: 190 }, { text: 'Quantity', datafield: 'quantity', width: 90, cellsalign: 'right' }, { text: 'Price', datafield: 'price', cellsalign: 'right', cellsformat: 'c2' } ] }); // create context menu $.ajax({ url: '../sampledata/menu.txt', dataType: 'json', success: function (menuObject) { var menu = '<ul><li>Edit Selected Row</li><li>Delete Selected Row</li></ul>'; $('#Menu').html(menu); }, error: function (json, textStatus, errorThrown) { alert('Error in contextmenu: ' + errorThrown + '\ntextStatus: ' + textStatus + '\njson: ' + json); } }); var contextMenu = $("#Menu").jqxMenu({ width: 200, height: 58, autoOpenPopup: false, mode: 'popup', theme: theme }); $("#jqxgrid").on('contextmenu', function () { return false; }); // handle context menu clicks. $("#Menu").on('itemclick', function (event) { var args = event.args; var rowindex = $("#jqxgrid").jqxGrid('getselectedrowindex'); if ($.trim($(args).text()) == "Edit Selected Row") { editrow = rowindex; var offset = $("#jqxgrid").offset(); $("#popupWindow").jqxWindow({ position: { x: parseInt(offset.left) + 60, y: parseInt(offset.top) + 60} }); // get the clicked row's data and initialize the input fields. var dataRecord = $("#jqxgrid").jqxGrid('getrowdata', editrow); $("#firstName").val(dataRecord.firstname); $("#lastName").val(dataRecord.lastname); $("#product").val(dataRecord.productname); $("#quantity").jqxNumberInput({ decimal: dataRecord.quantity }); $("#price").jqxNumberInput({ decimal: dataRecord.price }); // show the popup window. $("#popupWindow").jqxWindow('show'); } else { var rowid = $("#jqxgrid").jqxGrid('getrowid', rowindex); $("#jqxgrid").jqxGrid('deleterow', rowid); } }); $("#jqxgrid").on('rowclick', function (event) { if (event.args.rightclick) { $("#jqxgrid").jqxGrid('selectrow', event.args.rowindex); var scrollTop = $(window).scrollTop(); var scrollLeft = $(window).scrollLeft(); contextMenu.jqxMenu('open', parseInt(event.args.originalEvent.clientX) + 5 + scrollLeft, parseInt(event.args.originalEvent.clientY) + 5 + scrollTop); return false; } }); // initialize the popup window and buttons. $("#popupWindow").jqxWindow({ width: 250, resizable: false, theme: theme, isModal: true, autoOpen: false, cancelButton: $("#Cancel"), modalOpacity: 0.01 }); $("#Cancel").jqxButton({ theme: theme }); $("#Save").jqxButton({ theme: theme }); // update the edited row when the user clicks the 'Save' button. $("#Save").click(function () { if (editrow >= 0) { var row = { firstname: $("#firstName").val(), lastname: $("#lastName").val(), productname: $("#product").val(), quantity: parseInt($("#quantity").jqxNumberInput('decimal')), price: parseFloat($("#price").jqxNumberInput('decimal')) }; var rowid = $("#jqxgrid").jqxGrid('getrowid', editrow); $('#jqxgrid').jqxGrid('updaterow', rowid, row); $("#popupWindow").jqxWindow('hide'); } }); }); </script> </head> <body class='default'> <div id='jqxWidget'> <div id="jqxgrid"></div> <div style="margin-top: 30px;"> <div id="cellbegineditevent"></div> <div style="margin-top: 10px;" id="cellendeditevent"></div> </div> <div id="popupWindow"> <div>Edit</div> <div style="overflow: hidden;"> <table> <tr> <td align="right">First Name:</td> <td align="left"><input id="firstName" /></td> </tr> <tr> <td align="right">Last Name:</td> <td align="left"><input id="lastName" /></td> </tr> <tr> <td align="right">Product:</td> <td align="left"><input id="product" /></td> </tr> <tr> <td align="right">Quantity:</td> <td align="left"><div id="quantity"></div></td> </tr> <tr> <td align="right">Price:</td> <td align="left"><div id="price"></div></td> </tr> <tr> <td align="right"></td> <td style="padding-top: 10px;" align="right"><input style="margin-right: 5px;" type="button" id="Save" value="Save" /><input id="Cancel" type="button" value="Cancel" /></td> </tr> </table> </div> </div> </div> <div id='Menu'> </div> </body> </html>
Hi Peter Sloth,
The problem in this code is that you try to create a Menu which does not have items. Your UL and LI tags are added after the jqxMenu constructor function is called. However, the jqxMenu’s constructor function should be called when you have data in the DIV tag. So the solution is: set async: false in your Ajax call or create the Menu in your Ajax call’s success callback function.
Best Regards,
Peter StoevjQWidgets Team
http://www.jqwidgets.com/ -
AuthorPosts
You must be logged in to reply to this topic.