Maison interface Web js tutoriel Explication détaillée de la prise en charge ajax personnalisée pour l'encapsulation de composants inter-domaines

Explication détaillée de la prise en charge ajax personnalisée pour l'encapsulation de composants inter-domaines

Feb 09, 2018 am 09:49 AM
ajax 封装 自定义

Cet article vous donne principalement une analyse détaillée des points de connaissances liés à la prise en charge ajax personnalisée pour l'encapsulation de composants inter-domaines. Les amis qui sont intéressés par cela peuvent s'y référer et espérer aider tout le monde.

Analyse Class.create()

Imiter un prototype pour créer un héritage de classe

var Class = {
  create: function () {
    var c = function () {
      this.request.apply(this, arguments);
    }
    for (var i = 0, il = arguments.length, it; i < il; i++) {
      it = arguments[i];
      if (it == null) continue;
      Object.extend(c.prototype, it);
    }
    return c;
  }
};
Object.extend = function (tObj, sObj) { 
  for (var o in sObj) {
    tObj[o] = sObj[o];
  }
  return tObj;
};
Copier après la connexion

Définition ajax : ZIP_Ajax=Class.create();

La méthode create renvoie une requête de constructeur, qui équivaut à var ZIP_Ajax= function(){ this.request.apply(this, arguments }; Exécuter un processus de construction équivaut à confier la tâche de constructeur à la méthode de requête. This.request est ici la méthode de l'instance ZIP_Ajax, et cela pointe vers l'instance ZIP_Ajax This after apply pointe vers ZIP_Ajax Enfin selon le nouveau mot-clé. , cela pointe en fait vers la classe ZIP_Ajax. Avec la définition de la classe ZIP_Ajax, vous pouvez ensuite définir sa méthode :

Explication détaillée de XMLHttpRequest :

XMLHttpRequest n'est pas une technologie mais une fonction intégrée aux navigateurs grand public Accès complet. aux objets de protocole http. La plupart des requêtes http traditionnelles sont basées sur la soumission d'un formulaire et demandent http, puis renvoient un formulaire. Bien que XMLHttpRequest prenne en charge les requêtes synchrones, le plus grand avantage est qu'il prend en charge la transmission asynchrone pour recevoir des données. La création d'une nouvelle requête ajax revient en fait à instancier un objet XMLHttpRequest. Présentez brièvement les principaux événements et méthodes :

Événement readystatechange :

Lorsque XMLHttpRequest envoie une requête http, un événement readystatechange sera déclenché. L'événement renvoie cinq valeurs 0. , 1 et 2 représentent respectivement la création de XMLHttpRequest, l'achèvement de l'initialisation de XMLHttpRequest et l'envoi de la requête 3 représente que la réponse n'est pas terminée (c'est-à-dire que seules les données d'en-tête de réponse sont reçues). réponse complète.

Le statut renvoyé indique le code d'état renvoyé par le serveur :

Les codes couramment utilisés sont 200 indiquant un retour réussi des données, 301 redirection permanente et 302 redirection temporaire. (pas de sécurité) 304 lit les données mises en cache, 400 indique une erreur de syntaxe dans la demande, 403 indique que le serveur rejette la demande, 404 indique que la ressource de page Web demandée n'existe pas, 405 ne peut pas trouver le serveur à l'emplacement spécifié, 408 indique que la demande a expiré, 500 indique une erreur interne du serveur et 505 indique que le serveur La version du protocole http demandée n'est pas prise en charge.

200-300 signifie succès, 300-400 signifie redirection, 400-500 signifie que le contenu ou le format de la demande ou le corps de la demande est trop volumineux, provoquant une erreur, 500+ signifie une erreur interne du serveur

méthode open :

open reçoit trois paramètres : type de requête (get, post, head, etc.), url, synchrone ou asynchrone

méthode d'envoi :

Lorsque la requête est prête, la méthode d'envoi sera déclenchée, et le contenu envoyé est les données demandées (s'il s'agit d'une requête get, le paramètre est nul ;

Une fois la requête réussie, le succès sera exécuté Méthode personnalisée dont le paramètre est return data

ajax cross-domain :

Qu'est-ce que cross ; -domaine ?

Si deux sites Lorsque www.a.com souhaite demander des données à www.b.com, des problèmes inter-domaines surviennent en raison de noms de domaine incohérents, même si les noms de domaine sont les mêmes. de même, si les ports sont différents, il y aura des problèmes inter-domaines (pour cette raison, js ne peut que rester là et regarder. ). Déterminer s'il s'agit d'un inter-domaine n'est déterminé que par window.location.protocol+window.location. .host. Par exemple, http://www.baidu.com.

Il existe plusieurs façons de résoudre les problèmes inter-domaines avec js Solution ? . document.domain+iframe

Pour les requêtes avec le même domaine principal mais des sous-domaines différents, le nom de domaine + iframe peut être utilisé comme solution. L'idée spécifique est qu'il y a deux fichiers ab différents sous le nom de domaine. www.a.com/a.html

et hi.a.com/b.html, on peut ajouter document.domain=" aux deux fichiers html a.com", puis créer une iframe dans le fichier a pour contrôler le contenuDocument de l'iframe, afin que les deux fichiers puissent communiquer. Par exemple :

a sur www.a.com. 🎜>
Dans le fichier b.html sur hi.a.com

document.domain="a.com";
document.domain="a.com";
  var selfFrame=document.createElement("iframe");
  selfFrame.src="http://hi.a.com/b.html";
  selfFrame.style.display="none";
  document.body.appendChild(selfFrame);
  selfFrame.onload=function(){
    var doc=selfFrame.contentDocument||selfFrame.contentWindow.document;//得到操作b.html权限
    alert(doc.getElementById("ok_b").innerHTML());//具体操作b文件中元素
  }
Copier après la connexion


Problèmes :

1. Sécurité. Lorsqu'un site (hi.a.com) est attaqué, un autre site (www.a.com) provoquera une vulnérabilité de sécurité. 2. Si vous introduisez plusieurs iframes. capable de faire fonctionner toutes les iframes, vous devez définir le même domaine

2. Créer dynamiquement des scripts (la légendaire méthode jsonp)

Les navigateurs interdisent le croisement d'accès au domaine, mais c'est le cas. Il n'est pas interdit de référencer des fichiers js d'autres noms de domaine dans la page, et les méthodes introduites dans les fichiers js peuvent être exécutées. Sur cette base, nous pouvons réaliser une communication interdomaine complète en créant des méthodes de nœud de script. Les étapes d'implémentation sont :

a. Charger dynamiquement un script sur la page de l'initiateur de la requête. L'url du script pointe vers le backend du destinataire. La méthode javascript renvoyée par l'adresse sera exécutée par l'initiateur. . L'URL peut transmettre des paramètres et ne prend en charge que les paramètres de soumission.


b. Lors du chargement du script, appelez la méthode js inter-domaines pour le traitement de rappel (jsonp).


Par exemple :


Initiateur


Récepteur :

Le récepteur n'a besoin de renvoyer qu'une seule exécution fonction, la fonction d'exécution est le rappel dans la requête et attribue des paramètres.
function uploadScript(options){
  var head=document.getElementsByTagName("head")[0];
  var script=document.createElement("script");
  script.type="text/javasctipt";
  options.src += &#39;?callback=&#39; + options.callback;
  script.src=options.src;
  head.insertBefore(script,head.firstChild);
}
function callback(data){}
window.onload=function(){//调用
  uploadScript({src:"http://e.com/xxx/main.ashx",callback:callback})
}
Copier après la connexion


3. Utilisez html5 postMessage :


L'une des nouvelles fonctionnalités de HTML5 est la transmission de messages entre documents, qui est désormais prise en charge et utilisée par la plupart des navigateurs (y compris ie8+). ), qui prend en charge la messagerie Web en temps réel et ne présente aucun problème entre domaines. postMessage est généralement utilisé avec iframe.

举例如下:

父页面:

<iframe id="myPost" src="http//www.a.com/main.html"></iframe>
window.onload=function(){
  document.getElementById("myPost").contentWindow.postMessage("显示我","http://www.a.com")
  //第二个参数表示确保数据发送给适合域名的文档
}
a.com/main.html页面:
window.addEventListener("message",function(event){
  if(event.origin.indexOf("a.com")>-1){
    document.getElementById("textArea").innerHTML=event.data;
  }
},false)
<body>
  <p>
    <span id="textArea"></span>
  </p>
</body>
Copier après la connexion

这样在父页面加载完成后main.html页面的textArea部分就会显示"显示我"三个字

ajax方法封装code:

ZIP_Ajax.prototype={
  request:function(url options){
    this.options=options;
    if(options.method=="jsonp"){//跨域请求
      return this.jsonp();
    }
    var httpRequest=this.http();
    options=Object.extend({method: 'get',
      async: true},options||{});
    
    if(options.method=="get"){
      url+=(url.indexOf('?')==-1?'?':'&')+options.data;
      options.data=null;
    }
    httpRequest.open(options.method,url,options.async);
    if (options.method == 'post') {
      httpRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
    }
    httpRequest.onreadystatechange = this._onStateChange.bind(this, httpRequest, url, options);
    httpRequest.send(options.data || null);//get请求情况下data为null
    return httpRequest;
  },
  jsonp:function(){
    jsonp_str = 'jsonp_' + new Date().getTime();
    eval(jsonp_str + ' = ' + this.options.callback + ';');    
    this.options.url += '?callback=' + jsonp_str;
    for(var i in this.options.data) {
      this.options.url += '&' + i + '=' + this.options.data[i];
    } 
    var doc_head = document.getElementsByTagName("head")[0],
      doc_js = document.createElement("script"),
      doc_js.src = this.options.url;
    doc_js.onload = doc_js.onreadystatechange = function(){
       if (!this.readyState || this.readyState == "loaded" || this.readyState == "complete"){
         //清除JS
         doc_head.removeChild(doc_js);      
        }
      }   
      doc_head.appendChild(doc_js);
  },
  http:function(){//判断是否支持xmlHttp
    if(window.XMLHttpRequest){
      return new XMLHttpRequest();
    }
    else{
      try{
        return new ActiveXObject('Msxml2.XMLHTTP')
      }
      catch(e){
        try {
          return new ActiveXObject('Microsoft.XMLHTTP');
        } catch (e) {
          return false;
        }
      }
    }
  },
  _onStateChange:function(http,url,options){
    if(http.readyState==4){
      http.onreadystatechange=function(){};//重置事件为空
      var s=http.status;
      if(typeof(s)=='number'&&s>200&&s<300){
        if(typeof(options.success)!='function')return;
        var format=http;
        if(typeof(options.format)=='string'){//判断请求数据格式
          switch(options.format){
            case 'text':
              format=http.responseText;
              break;
            case 'json':
              try{
                format=eval('('+http.responseText+')');
              }
              catch (e) {
                if (window.console && console.error) console.error(e);
              }
              break;
            case 'xml':
              format=http.responseXML;
              break;
          }
        }
      options.success(format);//成功回调
      }
      else {//请求出问题后处理
        if (window.closed) return;
        if (typeof (options.failure) == 'function') {
          var error = {
            status: http.status,
            statusText: http.statusText
          }
          //  判断是否是网络断线或者根本就请求不到服务器
          if (http.readyState == 4 && (http.status == 0 || http.status == 12030)) {
            //  是
            error.status = -1;
          }
          options.failure(error);
        }
      }
    } 
  }
};
Copier après la connexion

使用方法:

ajax调用举例:

var myAjax=new ZIP_Ajax("http://www.a.com/you.php",{
  method:"get",
  data:"key=123456&name=yuchao",
  format:"json",
  success:function(data){
    ......
  }
})
跨域请求调用举例:
var jsonp=new ZIP_Ajax("http://www.a.com/you.php",{
  method:"jsonp",
  data:{key:"123456",name:"yuchao"},
  callback:function(data){
    ......
  }
})
Copier après la connexion

相关推荐:

JS组件系列--组件封装深入:使用jquery data()和html 5 data-*属性初始化组件_html/css_WEB-ITnose

Ajax跨域的完美解决方案实例分享

最全ajax跨域解决方案

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment configurer rapidement un avatar personnalisé dans Netflix Comment configurer rapidement un avatar personnalisé dans Netflix Feb 19, 2024 pm 06:33 PM

Un avatar sur Netflix est une représentation visuelle de votre identité de streaming. Les utilisateurs peuvent aller au-delà de l'avatar par défaut pour exprimer leur personnalité. Continuez à lire cet article pour savoir comment définir une photo de profil personnalisée dans l'application Netflix. Comment définir rapidement un avatar personnalisé dans Netflix Dans Netflix, il n'y a pas de fonctionnalité intégrée pour définir une photo de profil. Cependant, vous pouvez le faire en installant l'extension Netflix sur votre navigateur. Tout d’abord, installez une photo de profil personnalisée pour l’extension Netflix sur votre navigateur. Vous pouvez l'acheter dans la boutique Chrome. Après avoir installé l'extension, ouvrez Netflix sur votre navigateur et connectez-vous à votre compte. Accédez à votre profil dans le coin supérieur droit et cliquez sur

Comment personnaliser les paramètres des touches de raccourci dans Eclipse Comment personnaliser les paramètres des touches de raccourci dans Eclipse Jan 28, 2024 am 10:01 AM

Comment personnaliser les paramètres des touches de raccourci dans Eclipse ? En tant que développeur, la maîtrise des touches de raccourci est l'une des clés pour améliorer l'efficacité du codage dans Eclipse. En tant qu'environnement de développement intégré puissant, Eclipse fournit non seulement de nombreuses touches de raccourci par défaut, mais permet également aux utilisateurs de les personnaliser selon leurs propres préférences. Cet article explique comment personnaliser les paramètres des touches de raccourci dans Eclipse et donne des exemples de code spécifiques. Ouvrez Eclipse Tout d'abord, ouvrez Eclipse et entrez

Comment résoudre l'erreur 403 rencontrée par la requête jQuery AJAX Comment résoudre l'erreur 403 rencontrée par la requête jQuery AJAX Feb 20, 2024 am 10:07 AM

Titre : Méthodes et exemples de code pour résoudre les erreurs 403 dans les requêtes jQuery AJAX L'erreur 403 fait référence à une demande selon laquelle le serveur interdit l'accès à une ressource. Cette erreur se produit généralement parce que la demande manque d'autorisations ou est rejetée par le serveur. Lorsque vous effectuez des requêtes jQueryAJAX, vous rencontrez parfois cette situation. Cet article explique comment résoudre ce problème et fournit des exemples de code. Solution : Vérifiez les autorisations : assurez-vous d'abord que l'adresse URL demandée est correcte et vérifiez que vous disposez des autorisations suffisantes pour accéder à la ressource.

Le processus de fonctionnement de la disposition d'écran personnalisée edius Le processus de fonctionnement de la disposition d'écran personnalisée edius Mar 27, 2024 pm 06:50 PM

1. L'image ci-dessous est la disposition d'écran par défaut d'edius. La disposition par défaut de la fenêtre EDIUS est une disposition horizontale. Par conséquent, dans un environnement à moniteur unique, de nombreuses fenêtres se chevauchent et la fenêtre d'aperçu est en mode fenêtre unique. 2. Vous pouvez activer le [Mode double fenêtre] via la barre de menu [Affichage] pour que la fenêtre d'aperçu affiche simultanément la fenêtre de lecture et la fenêtre d'enregistrement. 3. Vous pouvez restaurer la disposition d'écran par défaut via [Barre de menu Affichage> Disposition des fenêtres> Général]. De plus, vous pouvez également personnaliser la disposition qui vous convient et l'enregistrer comme disposition d'écran couramment utilisée : faites glisser la fenêtre vers une disposition qui vous convient, puis cliquez sur [Affichage > Disposition de la fenêtre > Enregistrer la disposition actuelle > Nouveau], et dans le pop-up [Enregistrer la mise en page actuelle] Mise en page] entrez le nom de la mise en page dans la petite fenêtre et cliquez sur OK

Comment résoudre l'erreur 403 de la requête jQuery AJAX Comment résoudre l'erreur 403 de la requête jQuery AJAX Feb 19, 2024 pm 05:55 PM

jQuery est une bibliothèque JavaScript populaire utilisée pour simplifier le développement côté client. AJAX est une technologie qui envoie des requêtes asynchrones et interagit avec le serveur sans recharger la page Web entière. Cependant, lorsque vous utilisez jQuery pour effectuer des requêtes AJAX, vous rencontrez parfois des erreurs 403. Les erreurs 403 sont généralement des erreurs d'accès refusé par le serveur, probablement en raison de problèmes de politique de sécurité ou d'autorisation. Dans cet article, nous verrons comment résoudre la requête jQueryAJAX rencontrant une erreur 403.

TrendForce : les produits de la plate-forme Blackwell de Nvidia permettent d'augmenter la capacité de production CoWoS de TSMC de 150 % cette année TrendForce : les produits de la plate-forme Blackwell de Nvidia permettent d'augmenter la capacité de production CoWoS de TSMC de 150 % cette année Apr 17, 2024 pm 08:00 PM

Selon les informations de ce site du 17 avril, TrendForce a récemment publié un rapport estimant que la demande pour les nouveaux produits de la plate-forme Blackwell de Nvidia est haussière et devrait entraîner une augmentation de la capacité totale de production d'emballages CoWoS de TSMC de plus de 150 % en 2024. Les nouveaux produits de la plate-forme Blackwell de NVIDIA comprennent des GPU de série B et des cartes accélératrices GB200 intégrant le propre processeur GraceArm de NVIDIA. TrendForce confirme que la chaîne d'approvisionnement est actuellement très optimiste quant au GB200. On estime que les livraisons en 2025 devraient dépasser le million d'unités, représentant 40 à 50 % des GPU haut de gamme de Nvidia. Nvidia prévoit de livrer des produits tels que le GB200 et le B100 au second semestre, mais le conditionnement des plaquettes en amont doit encore adopter des produits plus complexes.

PHP et Ajax : créer un moteur de suggestions de saisie semi-automatique PHP et Ajax : créer un moteur de suggestions de saisie semi-automatique Jun 02, 2024 pm 08:39 PM

Créez un moteur de suggestions de saisie semi-automatique en utilisant PHP et Ajax : Script côté serveur : gère les requêtes Ajax et renvoie des suggestions (autocomplete.php). Script client : envoyer une requête Ajax et afficher des suggestions (autocomplete.js). Cas pratique : Incluez le script dans la page HTML et spécifiez l'identifiant de l'élément d'entrée de recherche.

Comment personnaliser l'axe X et l'axe Y dans Excel ? (Comment personnaliser l'échelle des axes Excel) Comment personnaliser l'axe X et l'axe Y dans Excel ? (Comment personnaliser l'échelle des axes Excel) Mar 14, 2024 pm 02:10 PM

Dans un tableau Excel, vous devrez parfois insérer des axes de coordonnées pour voir l'évolution des données de manière plus intuitive. Certains amis ne savent toujours pas comment insérer les axes de coordonnées dans le tableau. Ensuite, je partagerai avec vous comment personnaliser l'échelle des axes de coordonnées dans Excel. Méthode d'insertion de l'axe des coordonnées : 1. Dans l'interface Excel, sélectionnez les données. 2. Dans l'interface d'insertion, cliquez pour insérer un histogramme ou un histogramme. 3. Dans l'interface développée, sélectionnez le type de graphique. 4. Dans l'interface contextuelle du tableau, cliquez sur Sélectionner les données. 5. Dans l'interface étendue, vous pouvez la personnaliser.

See all articles