fPopover.js V1.0.0

本文介绍了一个名为 fPopover.js 的轻量级弹出框插件,该插件支持 IE9 及以上浏览器,可用于快速实现 HTML 元素的弹出提示效果。文章详细解释了插件的使用方法、参数配置及 CSS 样式。

使用时候有问题,请与我联系,谢谢。
代码随便使用

/*!
 * fPopover.js v1.0.0
 * (c) 2017 Talent
 * Date: 2017-03-29
 * Support Broswer: IE9+ Firefox12+ Chrome4+ safair4+ Opera11.5+
 */
/**
 * @Other:for my girl friend:Fang Hong
 */
/**
 * 参数:option:
 * {
 * s:需要popover依附的元素(选择器) 必须有
 * x: popover在x轴上的位置(相对于目标元素,可无) 值有:left center right  n(n表示占百分之几不支持 px 默认为center) 以三角形的角尖作为定位的主体
 * y: popover在y轴上的位置(相对于目标元素,可无) 值有:top bottom(默认为top 即在目标元素的上方)
 * content: 展现在popover上的内容 字符串(html的字符串)
 * before:在popover生成后,需要执行的方法(必须是方法)
 * }
 * option可以只传入选择器(option为字符串)但是此使用方法必须在已经初始化之后,否则将直接抛错 不会执行之前的before操作
 * 
 * functionName: 需要执行的popover方法的名字(可无) 值有: show hidden destroy  默认为show  当未初始化的时候,functionName就是show 其余无效
 */
/**
 * 备注:getBoundingClientRect 中top left 是距离<视口>顶部 左边的距离
 */
/**
 * 使用方法 如下
 */
var option = {
    s: "#public",
    x: 'center',
    y: 'bottom',
    content: "<div><span>11111</span><div>2222</div></div>"
}
//当不是初始化的时候 可以如此:option = "#public"
fPopover(option,'show');

function fPopover(option, functionName) {
    "use strict"
    var type = 0; //0表示option为对象的模式 1表示option为字符串的模式
    var select //= window.$ 
    = function (selector) {
        return document.querySelector(selector);
    };
    //假如是字符串 则直接走已经初始化过的流程
    if (option.constructor === String) {
        if (select(option).fPopoverInit === undefined) throw 'fPopover has not been initialized!';
        type = 1;
    }
    var ele = type == 0 ? select(option.s) : select(option);
    var fPopoverInit = ele.fPopoverInit;
    var fName = functionName === undefined ? 'show' : functionName;
    var before = option.before === undefined ? function () {} : option.before;
    switch (type) {
        case 0:
            initialize(option, ele, fPopoverInit);
            before();
            break;
        case 1:
            exist(fPopoverInit, fName);
            break;
    }
    //执行before方法 此时主体已经加入body


    function initialize(option, ele, fPopoverInit) {
        var x = option.x === undefined ? 'center' : option.x.toString();
        var y = option.y === undefined ? 'top' : ((option.y === 'top' || option.y === 'bottom') === true ? option.y.toString() : 'top');
        var content = option.content === undefined ? '' : option.content;


        if (ele === undefined) {
            throw 'ele must be defined!';
        }

        //没有属性,表示没有初始化过popover 需要自己初始化创建
        if (fPopoverInit === undefined) {
            fPopoverInit = {};
            //创建popover的容器
            var pContiner = document.createElement('div');
            //创建popover内容的容器
            var pContext = document.createElement('div');;
            pContext.innerHTML = content; //插入内容
            //创建小三角的容器
            var pTri = document.createElement('div');
            if (y === 'top') {
                pContiner.appendChild(pContext);
                pContiner.appendChild(pTri);
            } else {
                pContiner.appendChild(pTri);
                pContiner.appendChild(pContext);
            }
            var id = 'fPopover' + Math.floor(Math.random() * 100000);
            pContiner.id = id;
            fPopoverInit['id'] = id; //插入id值,为了之后的popover定位
            document.body.appendChild(pContiner);

            //如果top 则为向下的三角 如果为bottom 则是向上的三角
            y === 'top' ? (pTri.className = 'fpopover-triangle fpopover-triangle-down') : (pTri.className = 'fpopover-triangle fpopover-triangle-up');
            pContiner.className = 'fpopover';
            pContext.className = 'fpopover-context';
            //获取元素的位置信息
            var matrix = ele.getBoundingClientRect();
            //开始对y进行处理 
            if (y === 'top') { //在选择元素的上方
                //确定三角形的位置
                pTri.style.top = pContiner.offsetHeight + 9 + 'px';
                pTri.style.left = pContiner.offsetWidth / 2 - 10 + 'px';

                //定位popover的位置
                var eWidth = ele.offsetWidth;
                pContiner.style.top = matrix.top - pContiner.offsetHeight - 10 + document.body.scrollTop + 'px';


            } else if (y === 'bottom') { //在选择元素的下方
                //先确定 小三角的位置
                pTri.style.top = (pTri.offsetHeight + 10) * (-1) + 'px';
                pTri.style.left = pContiner.offsetWidth / 2 - 10 + 'px';
                //确定大的popover的位置
                var eWidth = ele.offsetWidth;
                pContiner.style.top = matrix.top + ele.offsetHeight + 10 + document.body.scrollTop + 'px';


            } else {
                throw 'the value of "y" is illegal.'
            }
             //x影响的是popover的左右 left center right
            var leftOff = getXoffSet(x, ele);
            pContiner.style.left = matrix.left + leftOff - pContiner.offsetWidth / 2 + 'px';
            //给元素内部对象赋值 为了之后的 v1.0.1版本可以在初始化后重新进行定位组装
            fPopoverInit['x'] = x;
            fPopoverInit['y'] = y;
            ele.fPopoverInit = fPopoverInit;

        } else {
            exist(fPopoverInit, fName);
        }
    }
    /**
     * popover已经初始化后的方法
     */
    function exist(fPopoverInit, fName) {
        //popover已经被初始化过了,对于 hidden destroy两个方法,只要让其消失或者删除就可以了,无需重新进行定位计算
        switch (fName) {
            case "show":
                var id = fPopoverInit.id;
                select('#' + id).style.display = "block";
                break;
            case "hidden":
                var id = fPopoverInit.id;
                if (id === undefined) {
                    throw 'fPopover has error! ';
                }
                select('#' + id).style.display = 'none';
                break;
            case "destroy":
                select('#' + id).remove();
                break;
            default:
                throw 'the name of function is illegal.';
        }
    }
    //获取x轴上设定的偏移量
    function getXoffSet(x, ele) {
        var eWidth = ele.offsetWidth;
        var leftOff = 0;
        switch (x) {
            case "left":
                leftOff = 0;
                break;
            case "center":
                leftOff = eWidth / 2;
                break;
            case "right":
                leftOff = eWidth;
                break;
            default:
                if (!/^\d+\.{0,1}\d+$/.test(x) && x !== "0") {
                    return null;
                }
                leftOff = eWidth * x / 100;
                break;
        }
        return leftOff;
    }
}

cssd代码:

.fpopover {
    /*width: 100px;
    height: 100px;*/
    position: absolute;
    background-color: #fff;
    box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.24);
    border:1px solid #000;
    z-index: 999;
}

.fpopover-triangle {
    position: absolute;
}

.fpopover-triangle-up:after {
    content: " ";
    border-bottom: 10px solid #fff;
    border-left: 10px solid transparent;
    border-right: 10px solid transparent;
}

.fpopover-triangle-down:before {
    content: " ";
    border-top: 10px solid #fff;
    border-left: 10px solid transparent;
    border-right: 10px solid transparent;
}

.fpopover-context {
    margin: 4px;
}
<think>我们面对的问题:用户希望修改libssl.so.1.0.0的软链接路径,从/home/zxin10/lib/libssl.so.1.0.0改为指向/lib64/libssl.so.1.0.0。 但是,请注意,我们通常不直接修改库文件的软链接路径,而是通过调整环境变量(如LD_LIBRARY_PATH)或者重新配置动态链接器的缓存(ldconfig)来管理库的查找路径。 然而,如果用户确实需要改变软链接的指向,我们可以通过以下步骤实现: 步骤1:确认目标库文件存在 首先,我们需要确保目标路径`/lib64/libssl.so.1.0.0`确实存在。如果不存在,那么我们需要先找到正确的库文件位置,或者将库文件复制到该位置(注意:复制系统库需要谨慎,通常不推荐随意替换系统库)。 步骤2:删除旧的软链接(如果存在) 用户当前有一个软链接`/home/zxin10/lib/libssl.so.1.0.0`,我们需要将其删除(或者先备份)以便创建新的软链接。但是,请注意,这个软链接可能是某个程序依赖的,所以删除前需要确认。 步骤3:创建新的软链接 我们想要创建新的软链接,将`/home/zxin10/lib/libssl.so.1.0.0`指向新的目标`/lib64/libssl.so.1.0.0`。但是,这里有一个问题:通常软链接的路径是绝对路径,而且我们改变的是软链接本身的位置还是指向?根据用户描述,他想要改变软链接的指向。 然而,用户描述中,当前软链接的路径是`/home/zxin10/lib/libssl.so.1.0.0`,他想将其改为指向`/lib64/libssl.so.1.0.0`。这意味着,我们实际上是要修改这个软链接文件,使其指向新的目标。 操作命令: 1. 删除旧的软链接:`rm /home/zxin10/lib/libssl.so.1.0.0` 2. 创建新的软链接:`ln -s /lib64/libssl.so.1.0.0 /home/zxin10/lib/libssl.so.1.0.0` 但是,请注意:这样操作之后,所有试图通过`/home/zxin10/lib/libssl.so.1.0.0`加载库的程序都会去加载`/lib64/libssl.so.1.0.0`。 然而,根据引用[1]中的信息,程序在运行时是通过动态链接器查找库的,动态链接器会按照一定的顺序(如LD_LIBRARY_PATH、/etc/ld.so.cache等)查找库。所以,如果用户只是希望程序使用`/lib64`下的库,更推荐的方法是调整LD_LIBRARY_PATH或者使用ldconfig。 另外,引用[2][3][4]提到了一些关于库版本冲突的问题,修改软链接可能会引发类似问题,因此需要谨慎。 因此,我们给出两种方案: 方案一(直接修改软链接): 1. 确认目标库文件存在:`ls -l /lib64/libssl.so.1.0.0` 2. 备份旧的软链接(可选):`mv /home/zxin10/lib/libssl.so.1.0.0 /home/zxin10/lib/libssl.so.1.0.0.bak` 3. 创建新的软链接:`ln -s /lib64/libssl.so.1.0.0 /home/zxin10/lib/libssl.so.1.0.0` 方案二(推荐,通过调整动态链接库路径): 1. 将`/lib64`添加到动态链接库的搜索路径中。可以通过设置环境变量LD_LIBRARY_PATH,或者在/etc/ld.so.conf.d/目录下创建一个新的配置文件(例如mylib.conf),写入`/lib64`,然后运行`ldconfig`更新缓存。 - 例如,在/etc/ld.so.conf.d/mylib.conf中加入一行:`/lib64` - 然后执行:`sudo ldconfig` 2. 这样,系统就会在`/lib64`目录下搜索动态库,而无需修改软链接。 但是,用户可能因为某些原因必须修改软链接。因此,我们按照方案一给出具体步骤。 注意:操作前请确保你有足够的权限,并且理解操作的影响。 具体步骤(方案一): 1. 检查目标库文件是否存在: ```bash ls -l /lib64/libssl.so.1.0.0 ``` 如果不存在,需要先找到正确的路径,或者安装相应的库。 2. 备份旧的软链接(可选,建议): ```bash mv /home/zxin10/lib/libssl.so.1.0.0 /home/zxin10/lib/libssl.so.1.0.0.bak ``` 3. 创建新的软链接: ```bash ln -s /lib64/libssl.so.1.0.0 /home/zxin10/lib/libssl.so.1.0.0 ``` 4. 验证新的软链接: ```bash ls -l /home/zxin10/lib/libssl.so.1.0.0 ``` 应该显示指向`/lib64/libssl.so.1.0.0`。 但是,请注意:如果`/home/zxin10/lib`目录不在动态链接器的默认搜索路径中,那么即使修改了这个软链接,程序也不会自动使用它。所以,通常还需要确保程序能够找到这个目录,比如通过设置LD_LIBRARY_PATH: ```bash export LD_LIBRARY_PATH=/home/zxin10/lib:$LD_LIBRARY_PATH ``` 或者将这条命令添加到~/.bashrc中。 然而,根据引用[1]中ldd命令的输出,程序`libcurl.so`在运行时找到了`/home/zoltar/anaconda/lib/`下的库,这是因为该路径在LD_LIBRARY_PATH中或者被rpath指定。所以,如果用户希望程序使用新的软链接,需要确保`/home/zxin10/lib`在LD_LIBRARY_PATH中(并且位于其他可能包含该库的路径之前)。 因此,我们还需要设置环境变量。 总结步骤: 1. 修改软链接指向(如上方案一)。 2. 设置环境变量LD_LIBRARY_PATH,包含`/home/zxin10/lib`,并确保它在其他路径之前被搜索。 但是,如果用户不希望设置环境变量,也可以考虑将库文件放在系统默认的搜索路径(如`/usr/lib`或`/lib64`)下,然后通过ldconfig更新缓存。但这样需要将库文件复制到系统目录,可能影响其他程序,不推荐。 因此,我们按照用户要求修改软链接,并设置环境变量。 注意:如果用户是系统管理员,并且希望所有用户都使用这个库,可以考虑将库文件放在系统目录并运行ldconfig。但根据问题描述,用户只是修改一个软链接,所以我们按照用户要求操作。 最后,我们提醒用户:修改系统库或链接关系可能导致程序运行异常,请谨慎操作。 生成相关问题: 1. 如何查看一个程序运行时加载的库文件路径? 2. 如何设置永久生效的LD_LIBRARY_PATH环境变量? 3. 动态链接器搜索库的路径顺序是怎样的? 4. 如何解决库版本冲突的问题?</think>### 修改 libssl.so.1.0.0 软链接路径的步骤 #### 1. **确认目标库文件存在** 首先检查 `/lib64/libssl.so.1.0.0` 是否存在: ```bash ls -l /lib64/libssl.so.1.0.0 ``` 若不存在,需先安装或定位正确路径(如通过 `find / -name libssl.so.1.0.0` 搜索)。 #### 2. **删除旧软链接** ```bash rm -f /home/zxin10/lib/libssl.so.1.0.0 ``` > ⚠️ 注意:删除前确保无程序依赖此路径,否则可能导致程序异常[^1][^2]。 #### 3. **创建新软链接** ```bash ln -s /lib64/libssl.so.1.0.0 /home/zxin10/lib/libssl.so.1.0.0 ``` #### 4. **验证软链接** ```bash ls -l /home/zxin10/lib/libssl.so.1.0.0 ``` 正常输出应显示: ```bash lrwxrwxrwx 1 user group 23 Jun 10 12:00 /home/zxin10/lib/libssl.so.1.0.0 -> /lib64/libssl.so.1.0.0 ``` #### 5. **更新动态链接器缓存(可选)** 若程序仍加载旧路径,更新缓存: ```bash sudo ldconfig ``` --- ### 关键注意事项 1. **权限问题** 操作需 `sudo` 权限,尤其修改 `/lib64` 系统目录时。 2. **版本冲突** 确保 `/lib64/libssl.so.1.0.0` 版本兼容程序需求,避免出现 `no version information available` 错误[^3]。 3. **依赖检查** 修改后使用 `ldd /path/to/your_binary` 验证程序是否加载正确库路径[^1][^4]。 4. **备选方案** - **环境变量**:临时指定路径 `export LD_LIBRARY_PATH=/lib64:$LD_LIBRARY_PATH` - **配置文件**:永久生效可添加路径到 `/etc/ld.so.conf.d/` 并执行 `ldconfig` --- ### 相关问题 1. 如何检查 Linux 程序依赖的动态库路径? 2. 解决 `libssl.so.10: version not found` 错误的方法有哪些? 3. 修改软链接后程序仍加载旧库可能是什么原因? 4. 如何安全替换系统级别的共享库文件(如 `/lib64` 下的库)? [^1]: 引用自 `ldd` 输出示例 [^2]: 引用自库冲突警告 [^3]: 引用自版本信息缺失错误 [^4]: 引用自依赖项检查建议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值