diff --git a/sui/core/event.go b/sui/core/event.go index b231de48..f36131fa 100644 --- a/sui/core/event.go +++ b/sui/core/event.go @@ -94,10 +94,12 @@ func GetEventScript(sequence int, sel *goquery.Selection, ns string, cn string, for name, handler := range events { if ispage { source += pageEventInjectScript(id, name, dataRaw, jsonRaw, handler) + "\n" + sel.SetAttr("s:event-cn", "__page") } else { source += compEventInjectScript(id, name, cn, dataRaw, jsonRaw, handler) + "\n" + sel.SetAttr("s:event-cn", cn) } - sel.RemoveAttr(fmt.Sprintf("s:on-%s", name)) + // sel.RemoveAttr(fmt.Sprintf("s:on-%s", name)) } sel.SetAttr("s:event", id) diff --git a/sui/core/injections.go b/sui/core/injections.go index 86b0cf28..5707dc14 100644 --- a/sui/core/injections.go +++ b/sui/core/injections.go @@ -55,7 +55,7 @@ const initScriptTmpl = ` const cn = element.getAttribute("s:cn"); if (method && typeof window[cn] === "function") { try { - window[cn](element); + new window[cn](element); } catch (e) { const message = e.message || e || "An error occurred"; console.error(` + "`[SUI] ${cn} Error: ${message}`" + `); @@ -82,13 +82,17 @@ const i118nScriptTmpl = ` ` const pageEventScriptTmpl = ` - document.querySelector("[s\\:event=%s]").addEventListener("%s", function (event) { - const dataKeys = %s; - const jsonKeys = %s; - const root = document.body; - const target = this; - __sui_event_handler(event, dataKeys, jsonKeys, target, root, %s); - }); + if (document.querySelector("[s\\:event=%s]")) { + let elms = document.querySelectorAll("[s\\:event=%s]"); + elms.forEach(function (element) { + element.addEventListener("%s", function (event) { + const dataKeys = %s; + const jsonKeys = %s; + const root = document.body; + __sui_event_handler(event, dataKeys, jsonKeys, element, root, window.%s); + }); + }); + } ` const compEventScriptTmpl = ` @@ -153,7 +157,7 @@ func headInjectionScript(jsonRaw string) string { } func pageEventInjectScript(eventID, eventName, dataKeys, jsonKeys, handler string) string { - return fmt.Sprintf(pageEventScriptTmpl, eventID, eventName, dataKeys, jsonKeys, handler) + return fmt.Sprintf(pageEventScriptTmpl, eventID, eventID, eventName, dataKeys, jsonKeys, handler) } func compEventInjectScript(eventID, eventName, component, dataKeys, jsonKeys, handler string) string { diff --git a/sui/core/parser.go b/sui/core/parser.go index b4d7367f..041dbf48 100644 --- a/sui/core/parser.go +++ b/sui/core/parser.go @@ -68,19 +68,21 @@ var keepWords = map[string]bool{ } var allowUsePropAttrs = map[string]bool{ - "s:if": true, - "s:elif": true, - "s:for": true, - "s:event": true, - "s:render": true, + "s:if": true, + "s:elif": true, + "s:for": true, + "s:event": true, + "s:event-cn": true, + "s:render": true, } var keepAttrs = map[string]bool{ - "s:ns": true, - "s:cn": true, - "s:ready": true, - "s:event": true, - "s:render": true, + "s:ns": true, + "s:cn": true, + "s:ready": true, + "s:event": true, + "s:event-cn": true, + "s:render": true, } // NewTemplateParser create a new template parser @@ -863,7 +865,7 @@ func (parser *TemplateParser) Tidy(s *goquery.Selection) { // Remove the parsed attribute attrs := []html.Attribute{} for _, attr := range node.Attr { - if strings.HasPrefix(attr.Key, "s:") && !keepAttrs[attr.Key] { + if strings.HasPrefix(attr.Key, "s:") && !keepAttrs[attr.Key] && !strings.HasPrefix(attr.Key, "s:on-") { continue }