Merge lp:~openerp-dev/openobject-client-web/trunk-prevent-click-before-document-is-ready into lp:openobject-client-web/trunk

Proposed by Olivier Laurent (Open ERP)
Status: Merged
Merged at revision: 4102
Proposed branch: lp:~openerp-dev/openobject-client-web/trunk-prevent-click-before-document-is-ready
Merge into: lp:openobject-client-web/trunk
Diff against target: 157 lines (+49/-24)
4 files modified
addons/openerp/controllers/templates/header.mako (+6/-0)
addons/openerp/controllers/templates/index.mako (+25/-19)
addons/openerp/static/javascript/openerp/openerp.base.js (+12/-5)
openobject/controllers/templates/base.mako (+6/-0)
To merge this branch: bzr merge lp:~openerp-dev/openobject-client-web/trunk-prevent-click-before-document-is-ready
Reviewer Review Type Date Requested Status
Xavier (Open ERP) (community) Needs Fixing
Review via email: mp+42473@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Xavier (Open ERP) (xmo-deactivatedaccount) wrote :

* There's commented code commited
* I'd recommend using jQuery.fn.delegate() rather than live() (it's easier to understand, and though that's not really relevant for us it can also be set on an arbitrary root element)
* A `return false` in an event handler combines `e.preventDefault` and `e.stopPropagation`, no need for both
* If you use `.live()` or `jQuery(document).delegate` and don't need to perform specific tests (presence or not of an element for instance) you might as well move the behavior into a JS file instead of leaving it into a template. You're not unbinding the event anyway so…
* Instead of creating one-off preventDefault calls (jQuery('#add_user_widget').live, Query('div#shortcuts a ').live, …) maybe just prefix the jQuery.ready call in openerp.base.js by a blanked preventDefault along the lines of:

    jQuery(document).delegate('a[href]:not([target]):not([href^="#"]):not([href^="javascript"]):not([rel=external])', 'click', function (e) {
        e.preventDefault();
    });

  and undelegate() it right before setting up the "real" event delegation targets?

review: Needs Fixing
Revision history for this message
Xavier (Open ERP) (xmo-deactivatedaccount) wrote :

Also, we should probably extract the big fucked-up link selector into its own constant one day.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'addons/openerp/controllers/templates/header.mako'
2--- addons/openerp/controllers/templates/header.mako 2010-11-26 09:01:54 +0000
3+++ addons/openerp/controllers/templates/header.mako 2010-12-02 13:32:52 +0000
4@@ -107,4 +107,10 @@
5 e.preventDefault();
6 openobject.tools.openWindow(this.href);
7 });
8+
9+ jQuery('div#shortcuts a ').live('click', function (e) {
10+ e.preventDefault();
11+ });
12+
13 </script>
14+
15
16=== modified file 'addons/openerp/controllers/templates/index.mako'
17--- addons/openerp/controllers/templates/index.mako 2010-11-29 11:36:45 +0000
18+++ addons/openerp/controllers/templates/index.mako 2010-12-02 13:32:52 +0000
19@@ -6,11 +6,30 @@
20 <script type="text/javascript" src="/openerp/static/javascript/accordion.js"></script>
21 <script type="text/javascript" src="/openerp/static/javascript/treegrid.js"></script>
22 <script type="text/javascript" src="/openerp/static/javascript/notebook/notebook.js"></script>
23-
24+
25 <script type="text/javascript">
26 var DOCUMENT_TO_LOAD = "${load_content|n}";
27 var CAL_INSTANCE = null;
28
29+ // Make user home widgets deletable
30+ jQuery('#user_widgets a.close').live('click', function(e) {
31+ var $widget = jQuery(this);
32+ jQuery.post(
33+ $widget.attr('href'),
34+ {widget_id: $widget.attr('id')},
35+ function(obj) {
36+ if(obj.error) {
37+ error_display(obj.error);
38+ return;
39+ }
40+ var $root = $widget.closest('.sideheader-a');
41+ $root.next()
42+ .add($root)
43+ .remove();
44+ }, 'json');
45+ e.preventDefault();
46+ });
47+
48 jQuery(document).ready(function () {
49 jQuery('.web_dashboard').hover(function () {
50 var $dashboard_item = jQuery(this);
51@@ -25,24 +44,6 @@
52 openLink(DOCUMENT_TO_LOAD);
53 return
54 }
55-
56- // Make user home widgets deletable
57- jQuery('#user_widgets a.close').click(function() {
58- var $widget = jQuery(this);
59- jQuery.post(
60- $widget.attr('href'),
61- {widget_id: $widget.attr('id')},
62- function(obj) {
63- if(obj.error) {
64- error_display(obj.error);
65- return;
66- }
67- var $root = $widget.closest('.sideheader-a');
68- $root.next()
69- .add($root)
70- .remove();
71- }, 'json');
72- });
73 });
74 </script>
75 </%def>
76@@ -163,6 +164,11 @@
77 id="add_user_widget" class="button-a"
78 style="right: 1px;">${_("Add")}</a>
79 <h2>${_("Widgets")}</h2>
80+ <script type="text/javascript">
81+ jQuery('#add_user_widget').live('click', function (e) {
82+ e.preventDefault();
83+ });
84+ </script>
85 </div>
86 <div class="box-a" id="user_widgets">
87 % for widget in widgets:
88
89=== modified file 'addons/openerp/static/javascript/openerp/openerp.base.js'
90--- addons/openerp/static/javascript/openerp/openerp.base.js 2010-11-29 11:13:59 +0000
91+++ addons/openerp/static/javascript/openerp/openerp.base.js 2010-12-02 13:32:52 +0000
92@@ -155,17 +155,20 @@
93 var LINK_WAIT_NO_ACTIVITY = 300;
94 /** @constant */
95 var FORM_WAIT_NO_ACTIVITY = 500;
96-jQuery(document).ready(function () {
97+
98+function addLinkHandlers() {
99+//jQuery(document).ready(function () {
100 var $app = jQuery('#appContent');
101 if ($app.length) {
102- jQuery('body').delegate('a[href]:not([target="_blank"]):not([href^="#"]):not([href^="javascript"]):not([rel=external])', 'click', function(){
103+ jQuery('body').delegate('a[href]:not([target="_blank"]):not([href^="#"]):not([href^="javascript"]):not([rel=external])', 'click', function(e){
104 validate_action();
105 });
106
107 // open un-targeted links in #appContent via xhr. Links with @target are considered
108 // external links. Ignore hash-links.
109- jQuery(document).delegate('a[href]:not([target]):not([href^="#"]):not([href^="javascript"]):not([rel=external])', 'click', function () {
110+ jQuery(document).delegate('a[href]:not([target]):not([href^="#"]):not([href^="javascript"]):not([rel=external])', 'click', function (e) {
111 openLink(jQuery(this).attr('href'));
112+ e.preventDefault();
113 return false;
114 });
115 // do the same for forms
116@@ -180,11 +183,12 @@
117 });
118 } else {
119 if(jQuery(document).find('div#root').length) {
120- jQuery(document).delegate('a[href]:not([target]):not([href^="#"]):not([href^="javascript"]):not([rel=external])', 'click', function() {
121+ jQuery(document).delegate('a[href]:not([target]):not([href^="#"]):not([href^="javascript"]):not([rel=external])', 'click', function(e) {
122 jQuery.ajax({
123 url: jQuery(this).attr('href'),
124 success: doLoadingSuccess(null)
125 });
126+ e.preventDefault();
127 return false;
128 });
129 }
130@@ -213,7 +217,10 @@
131 });
132 // if the initially loaded URL had a hash-url inside
133 jQuery(window).trigger('hashchange');
134-});
135+}
136+//});
137+
138+//addLinkHandlers();
139
140 // Hook onclick for boolean alteration propagation
141 jQuery(document).delegate(
142
143=== modified file 'openobject/controllers/templates/base.mako'
144--- openobject/controllers/templates/base.mako 2010-11-23 15:33:24 +0000
145+++ openobject/controllers/templates/base.mako 2010-12-02 13:32:52 +0000
146@@ -58,5 +58,11 @@
147 ${js.display()}
148 % endfor
149
150+<script type="text/javascript">
151+
152+addLinkHandlers();
153+
154+</script>
155+
156 </body>
157 </html>