0

私がやろうとしていることについて少し:

window.onload で、このページは AJAX で別の php ページを呼び出し、base64 でエンコードされた画像を応答として取得します。これはうまくいきます。画像が AJAX 経由で返されると、'img1' の src として設定されます。また、仕事も順調です。画像にも maphilight があるため、同じ AJAX 呼び出しでプルおよび設定される座標を持つエリア マップがあります。maphilight が Internet Explorer で作業を開始しないのはここからです。他のすべてのブラウザーでテストしたところ、ハイライトは正常に機能します。私の質問は、ハイライトを Internet Explorer で動作させるにはどうすればよいかということです。ここで何日も検索し、いくつかの興味深いことを試しました。最初にロードイベントを呼び出し、ページのロード後に.jsファイルをヘッドに追加し、画像のロードを確認してからjqueryプラグインを実行して、すべて役立たず。

wrap = $('<div></div>').css({
display:'block',
background: 'url("' + this.src + '")',
position:'relative',
padding:0,
width:this.width,
height:this.height
});

window.onload 関数が呼び出され、base64 イメージを取得するために AJAX 呼び出しが行われるまで、img.src は空白です。呼び出される関数と、それがページにどのように表示されるかを次に示します。

<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script>
<script src="jquery.maphilight.js" type="text/javascript"></script>
<script type="text/javascript">
  $(document).ready(function(){
   $.fn.maphilight.defaults = {
    fill: true,
    fillColor: 'ffffff',
    fillOpacity: 0.5,
    stroke: true,
    strokeColor: '0055bb',
    strokeOpacity: 1,
    strokeWidth: 1,
    fade: true,
    alwaysOn: false,
    neverOn: false,
    groupBy: false,
    wrapClass: true,
    shadow: false,
    shadowX: 0,
    shadowY: 0,
    shadowRadius: 6,
    shadowColor: '000000',
    shadowOpacity: 0.8,
    shadowPosition: 'outside',
    shadowFrom: false
    }
    $('img[usemap]').maphilight();
    });

window.onload = function(){
ajaxFunction();
    }

var ttxx = new Array();
function ajaxFunction(){
        var ajaxRequest;  // Start Ajax Request

    try{
        // Opera 8.0+, Firefox, Safari
        ajaxRequest = new XMLHttpRequest();
    } catch (e){
        // Internet Explorer Browsers
        try{
            ajaxRequest = new ActiveXObject('Msxml2.XMLHTTP');
        } catch (e) {
            try{
                ajaxRequest = new ActiveXObject('Microsoft.XMLHTTP');
            } catch (e){
                // Something went wrong
                alert('Your browser broke!');
                return false;
            }
        }
    }

    ajaxRequest.onreadystatechange = function(){
        if(ajaxRequest.readyState == 4){        
var resp = ajaxRequest.responseText;
var spl =  resp.split('SECIMG'); // response received divide it up to get all vars 
thei = spl[0]; // get img src1 (img to be hilighted)
var rest = spl[1]; // get rest of request
var im = document.getElementById('img1');// set var for img name
im.src = thei; // set img1 src as base64 code recived
var spl3 = rest.split('eb');
var tx = spl3[0]; // get txt values
var coor = spl3[1]; // get coordinates
var ttx = tx.split(':'); 
for (u = 0; u< 8; u++){
var ne = u + 1;
ttxx[ne] = ttx[u];
} 
var mid = '100,100'; // set coordinates
var indiv = coor.split('ec');
for (i = 0; i< 8; i++){
var coord = indiv[i];
var fullcoor = coord + ',' + mid;
var upone = i + 1;
var are = document.getElementById('ar' + upone);
are.coords = fullcoor; //coordinates set
}
}

    }
    ajaxRequest.open('GET', 'testajaximg.php', true);
    ajaxRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
    ajaxRequest.setRequestHeader('Authorization', 'GetCap');
    ajaxRequest.send(null); 
} // obviously set AJAX request
</script></head>

スペースと時間の制約のために含めない関数が他にもありますが、それらはすべて正常に機能します。(つまり、マップ エリアをクリックすると、アラートが送信されます)

画像が表示されるページの本文部分の HTML コードを次に示します (php で)。

<img id="img1" border="0" usemap="#cap"><br><br> /*img put here */
<map name="cap">";
$huy = 1;
$enlop = 8;
while ($huy <= $enlop){
echo"<area shape="polygon" id="ar".$huy."\" coords="" onclick=javascript:alert('Hello'".$huy."');">";
$huy++;
}
echo"</map>";

画像が表示されているため、画像が設定されていることがわかります。また、画像をクリックした場所に応じてアラートがスローされるため、座標と領域が設定されていることがわかります。画像の読み込みが早すぎて JavaScript で読み込まれないのでしょうか、それとも JavaScript が元の画像 src を読み込んで新しい画像に移動しないのでしょうか? どんな助けでも本当に感謝します。私のウェブサイトでコードのライブバージョンを見ることができます:

http://www.securacap.com/testajax2.php

この状況に光を当てることができる光をありがとう。すでにプラグインとスクリプトが多すぎるという理由だけで、imagesLoaded のようなプラグインを使用したくありません。できるだけシンプルに保つようにしています。

4

1 に答える 1

0

そのため、Maphilight Jquery プラグインを適応させて Internet Explorer で動的に表示される画像を操作する方法を検索して探している人にとって、私は問題を解決しました。これが他の人にも役立つことを願っています。

そのため、徹底的な試行錯誤の末、プラグインが元の画像の不透明度を 0 に設定して非表示にしていることを発見しました。元の画像の場所「this.src」が IE ブラウザー (特に IE6) で表示されると、Javascript もエラーをスローしていました。元のプラグインには、(IE6 が使用する) VML が使用されている場合に画像をレンダリングするための (has_VML) という関数が組み込まれていました。SO ここに私が前後に行ったことがあります (元の PHP ページや AJAX 呼び出しを変更する必要はありませんでした)。

maphilight に加えられた変更:

前:

248 行目:

  // The below "this.src" under background throws an error at internet explorer when using a dynamic  image that has no original src
 wrap = $('<div></div>').css({
 display:'block',
 background: 'url("'+this.src+'")',
 position:'relative',
 padding:0,
 width:this.width,
 height:this.height
 });

後: 248 行目:

  // Using the plugins function to check for VML, I set with a blank background for IE
     if (has_VML){
     wrap = $('<div></div>').css({
     display:'block',
     background: '',
     position:'relative',
     padding:0,
     width:this.width,
     height:this.height
     });
// This one is for Firefox, Chrome, Safari, etc. Image is set as background normally.
     } else {
     wrap = $('<div></div>').css({
     display:'block',
     background: 'url("'+this.src+'")',
     position:'relative',
     padding:0,
     width:this.width,
     height:this.height
     });
     }

これによりポインター エラーの問題は解決されますが、プラグインによって不透明度が 0 に設定されているため、元の画像は表示されません。そのため、VML 画像を別の方法でレンダリングするには、次の行で不透明度を変更する必要があります。

行 273: 前:

img.before(wrap).css('opacity', 0).css(canvas_style).remove(); //opacity for non VML
if(has_VML) { img.css('filter', 'Alpha(opacity=0)'); } //opacity for VML
wrap.append(img);

後:

  img.before(wrap).css('opacity', 0).css(canvas_style).remove(); //keep the same
        if(has_VML) { img.css('filter', 'Alpha(opacity=90)'); } //change to 90
        wrap.append(img);

元の画像の不透明度を 90% に変更すると、元々隠れていた画像が表示されるようになります。注: ハイライトを作成する div ラッパーが表示されないため、不透明度を 100% に変更することはできません。95% は、ハイライトが背景よりも明るくなる前に、おそらく移動できる最高値です。不透明度が 90% より低くても画像の見栄えが良い場合は、以下のさまざまなハイライト オプションを自由に使用できます。

これで画像が表示されたので、残りの唯一のことは、一番下の fn.defaults 関数を IF ステートメントに置き換えて、ハイライトを IE 固有の方法でレンダリングし、他の方法では異なる方法でレンダリングすることです。デフォルトの VML バージョンの設定のほとんどを変更することはできません。または、ハイライトが表示されなくなります。それでもハイライトの効果が得られます。

if (has_VML){ // render for VML // Note the settings are for 90% opacity set above:
    $.fn.maphilight.defaults = {
        fill: true,
    fillColor: '000000', // Color must be black or close or it won't be dark enough
    fillOpacity: 1, // full opacity
    stroke: true,
    strokeColor: '0055bb', //stroke color
    strokeOpacity: 1, //full opacity
    strokeWidth: 3, //thicker stroke to see border of hilight
    fade: true,
    alwaysOn: false,
    neverOn: false,
    groupBy: false,
    wrapClass: true,
    shadow: false,
    shadowX: 0,
    shadowY: 0,
    shadowRadius: 6,
    shadowColor: '888888',
    shadowOpacity: 0.8, //you can change this if you want
    shadowPosition: 'outside',
    shadowFrom: false
    };
    } else {// For all other browsers more options and more colors
        $.fn.maphilight.defaults = {
        fill: true,
    fillColor: 'ffffff',
    fillOpacity: .5,
    stroke: true,
    strokeColor: '0055bb',
    strokeOpacity: 1,
    strokeWidth: 1,
    fade: true,
    alwaysOn: false,
    neverOn: false,
    groupBy: false,
    wrapClass: true,
    shadow: false,
    shadowX: 0,
    shadowY: 0,
    shadowRadius: 6,
    shadowColor: '888888',
    shadowOpacity: 0.8,
    shadowPosition: 'outside',
    shadowFrom: false
    };
    }

それだけです。IE6 でエラーが発生するため、プラグインで img.src をリプルしないでください。そのため、元の画像の不透明度を 90% 以上に設定し、組み込みの has_VML 関数を使用して、検出されたブラウザーに応じたオプションを作成します。これが、この素晴らしいプラグインを動的画像で使用している将来の誰かに役立つことを願っています.

于 2013-06-06T02:01:37.270 に答える