获取对现有 OpenSeadragon Viewer 的引用
Get reference to existing OpenSeadragon Viewer
我需要向现有的 OpenSeadragon 查看器对象添加覆盖,该对象不是由我的代码创建的,而是在应用程序的其他地方创建的。
我已经知道查看器已创建,因为我可以访问通过 jQuery 创建的各种 html 元素。但是,我不知道是否有任何方法可以根据现有参考创建查看器。
我试过使用查看者的 ID div 在:
var viewer = OpenSeadragon(id: "open-seadragon-viewer-id");
但这似乎不起作用。
有什么方法可以做到这一点,还是只能在初始化它的代码中获取查看器?
这是一个疯狂的想法...您可以对 OSD 的某些部分进行猴子修补以吸引观众...
var viewer;
var originalIsOpen = OpenSeadragon.Viewer.prototype.isOpen;
OpenSeadragon.Viewer.prototype.isOpen = function() {
// Now we know the viewer!
viewer = this;
// Reinstate the original, since we only need to run our version once
OpenSeadragon.Viewer.prototype.isOpen = originalIsOpen;
// Call the original
return originalIsOpen.call(this);
}
有点俗气,但应该有用。请注意,这是假设页面上只有一个查看者...如果有多个查看者,同样的原则可以工作,但您需要跟踪一组查看者。
顺便说一句,我使用的是 isOpen,因为它很简单并且每一帧都会被调用。其他功能也可以。
编辑:固定代码,因此我们正在使用原型。我还没有真正测试过这段代码,所以可能仍然存在错误!
此解决方案不直接回答问题,因为它依赖于您自己的代码创建 OpenSeaDragon 对象。这是@iangilman 提到的将查看器存储在全局变量中的实现。但是其他人可能会发现它很有用。 (请注意,将全局变量传递给函数需要解决方法 - 请参阅 Passing a global variable to a function)
代码演示了如何使用同一个OpenSeaDragon对象显示不同的图片。
var viewer3=null; //global variable
var newURL1='image/imageToDisplay1.png';
var newURL2='image/imageToDisplay2.png';
var elementID='myID';
//the loadScan function will display the picture using openSeaDragon and can be called as many times as you want.
loadScan("viewer3",newURL1,elementID);
loadScan("viewer3",newURL2,elementID);
//the actual function
function loadScan(theViewer,newURL,theID) {
//if object has already been created, then just change the image
if (window[theViewer]!=null) {
window[theViewer].open({
type: 'image',
url: newURL
});
} else {
//create a new OpenSeadragon object
window[theViewer] = OpenSeadragon({
prefixUrl: "/myapp/vendor/openseadragon/images/",
id: theID,
defaultZoomLevel: 1,
tileSources: {
url: newURL,
type: 'image'
}
});
}
}
我需要向现有的 OpenSeadragon 查看器对象添加覆盖,该对象不是由我的代码创建的,而是在应用程序的其他地方创建的。
我已经知道查看器已创建,因为我可以访问通过 jQuery 创建的各种 html 元素。但是,我不知道是否有任何方法可以根据现有参考创建查看器。
我试过使用查看者的 ID div 在:
var viewer = OpenSeadragon(id: "open-seadragon-viewer-id");
但这似乎不起作用。
有什么方法可以做到这一点,还是只能在初始化它的代码中获取查看器?
这是一个疯狂的想法...您可以对 OSD 的某些部分进行猴子修补以吸引观众...
var viewer;
var originalIsOpen = OpenSeadragon.Viewer.prototype.isOpen;
OpenSeadragon.Viewer.prototype.isOpen = function() {
// Now we know the viewer!
viewer = this;
// Reinstate the original, since we only need to run our version once
OpenSeadragon.Viewer.prototype.isOpen = originalIsOpen;
// Call the original
return originalIsOpen.call(this);
}
有点俗气,但应该有用。请注意,这是假设页面上只有一个查看者...如果有多个查看者,同样的原则可以工作,但您需要跟踪一组查看者。
顺便说一句,我使用的是 isOpen,因为它很简单并且每一帧都会被调用。其他功能也可以。
编辑:固定代码,因此我们正在使用原型。我还没有真正测试过这段代码,所以可能仍然存在错误!
此解决方案不直接回答问题,因为它依赖于您自己的代码创建 OpenSeaDragon 对象。这是@iangilman 提到的将查看器存储在全局变量中的实现。但是其他人可能会发现它很有用。 (请注意,将全局变量传递给函数需要解决方法 - 请参阅 Passing a global variable to a function)
代码演示了如何使用同一个OpenSeaDragon对象显示不同的图片。
var viewer3=null; //global variable
var newURL1='image/imageToDisplay1.png';
var newURL2='image/imageToDisplay2.png';
var elementID='myID';
//the loadScan function will display the picture using openSeaDragon and can be called as many times as you want.
loadScan("viewer3",newURL1,elementID);
loadScan("viewer3",newURL2,elementID);
//the actual function
function loadScan(theViewer,newURL,theID) {
//if object has already been created, then just change the image
if (window[theViewer]!=null) {
window[theViewer].open({
type: 'image',
url: newURL
});
} else {
//create a new OpenSeadragon object
window[theViewer] = OpenSeadragon({
prefixUrl: "/myapp/vendor/openseadragon/images/",
id: theID,
defaultZoomLevel: 1,
tileSources: {
url: newURL,
type: 'image'
}
});
}
}