获取对现有 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'
                }
            });

        }
        
}