Programmatically triggering events in Javascript for IE using jQuery

后端 未结 6 1004
陌清茗
陌清茗 2021-01-04 19:22

When an Event is triggered by a user in IE, it is set to the window.event object. The only way to see what triggered the event is by accessing the window.

相关标签:
6条回答
  • 2021-01-04 20:02

    From what you're describing, this problem is likely a result of the unique event bubbling model that IE uses for JS.

    My only real answer is to ditch the ASP.NET validators and use a jQuery form validation plugin instead. Then your textbox can just be a regular ASP Webforms control and when the contents change and a postback occures all is good. In addition you keep more client-side concerns seperated from the server code.

    I've never had much luck mixing Webform Client controls (like the Form Validation controls) with external JS libraries like jQuery. I've found the better route is just to go with one or the other, but not to mix and match.

    Not the answer you're probably looking for.

    If you want to go with a jQuery form validation plugin concider this one jQuery Form Validation

    0 讨论(0)
  • 2021-01-04 20:10

    I solved the issue with a patch:

        window.ValidatorHookupEvent = function(control, eventType, body) {
            $(control).bind(eventType.slice(2), new Function("event", body));
        };
    

    Update: I've submitted the issue to MS (link).

    0 讨论(0)
  • 2021-01-04 20:16

    I had the same problem. Solved by using this function:

    jQuery.fn.extend({
        fire: function(evttype){ 
            el = this.get(0);
            if (document.createEvent) {
                var evt = document.createEvent('HTMLEvents'); 
                evt.initEvent(evttype, false, false); 
                el.dispatchEvent(evt); 
            } else if (document.createEventObject) { 
                el.fireEvent('on' + evttype); 
            }
            return this;
        }
    });
    

    So my "onSelect" event handler to datepicker looks like:

    if ($.browser.msie) {
        datepickerOptions = $.extend(datepickerOptions, { 
            onSelect: function(){
                $(this).fire("change").blur();
            }
        });
    }
    
    0 讨论(0)
  • 2021-01-04 20:23

    This is how I solved a simlar issue. Wrote an onSelect() handler for the datepicker. link text In that function, called __doPostBack('textboxcontrolid',''). This triggered a partial postback for the textbox to the server, which called the validators in turn.

    0 讨论(0)
  • 2021-01-04 20:26

    Consider setting the hidden field _EVENTTARGET value before initiating the event with javascript. You'll need to set it to the server side id (replace underscore with $ in the client id) for the server to understand it. I do this on button clicks that I simulate so that the server side can determine which OnClick method to fire when the result gets posted back -- Ajax or not, doesn't really matter.

    0 讨论(0)
  • 2021-01-04 20:28

    This is an endemic problem with jQuery datepickers and ASP validation controls. As you are saying, the wrong element cross-triggers an ASP NET javascript validation routine, and then the M$ code throws an error because the triggering element in the routine is undefined.

    I solved this one differently from anyone else I have seen - by deciding that M$ should have written their code more robustly, and hence redeclaring some of the M$ validator code to cope with the undefined element. Everything else I have seen is essentially a workaround on the jQuery side, and cuts possible functionality out (eg. using the click event instead of change).

    The bit that fails is

       for (i = 0; i < vals.length; i++) {
            ValidatorValidate(vals[i], null, event);
        }
    

    which throws an error when it tries to get a length for the undefined 'vals'.

    I just added

    if (vals) {
        for (i = 0; i < vals.length; i++) {
            ValidatorValidate(vals[i], null, event);
        }
    }
    

    and she's good to go. Final code, which redeclares the entire offending function, is below. I put it as a script include at the bottom of my master page or page.

    Yes, this does break upwards compatibility if M$ decide to change their validator code in the future. But one would hope they'll fix it and then we can get rid of this patch altogether.

    //  Fix issue with datepicker and ASPNET validators: redeclare MS validator code with fix
     function ValidatorOnChange(event) {
        if (!event) {
            event = window.event;
        }
        Page_InvalidControlToBeFocused = null;
        var targetedControl;
        if ((typeof (event.srcElement) != "undefined") && (event.srcElement != null)) {
            targetedControl = event.srcElement;
        }
        else {
            targetedControl = event.target;
        }
        var vals;
        if (typeof (targetedControl.Validators) != "undefined") {
            vals = targetedControl.Validators;
        }
        else {
            if (targetedControl.tagName.toLowerCase() == "label") {
                targetedControl = document.getElementById(targetedControl.htmlFor);
                vals = targetedControl.Validators;
            }
        }
        var i;
        if (vals) {
            for (i = 0; i < vals.length; i++) {
                ValidatorValidate(vals[i], null, event);
            }
        }
        ValidatorUpdateIsValid();
    }
    
    0 讨论(0)
提交回复
热议问题