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 函数并进行 AJAX 调用以检索 base64 图像之前,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,从而使其不可见。当 IE 浏览器(尤其是 IE6)看到原始图像位置“this.src”时,Javascript 也会向我抛出错误。如果使用 VML(IE6 使用),原始插件附带了一个内置的函数,称为 (has_VML) 来渲染图像。所以这就是我之前和之后所做的(不需要更改我的原始 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%,您可以看到最初隐藏的图像现在可见。注意:您不能将不透明度更改为 100%,因为创建高光的 div 包装器将不可见 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
    };
    }

就是这样了。不要让插件重新拉取 img.src,因为这会导致 IE6 出错。因此将原始图像的不透明度设置为 90% 或更高,并使用内置的 has_VML 函数根据检测到的浏览器创建选项。我希望这对将来使用这个带有动​​态图像的出色插件的人有所帮助。

于 2013-06-06T02:01:37.270 回答